我這邊想設定一個上位機控制單片機,與單片機之間進行的485通信。

左邊是三個功能模塊頁面以及資料實時顯示,點擊相應的模塊之后,右邊這個panel容器會替換成我設定的Form2,Form3對應的界面;比如這里離心機界面,我設定啟動之后,會通過串口發送給下位機。
我在共用這個串口時候出現了一些問題:

public static SerialPort serialPort1 = new SerialPort(); //這個是Form1主表單中的
public static IModbusMaster master;//這個是該離心機表單Form中的
運行時候老是報錯,之前只用一個表單時候并沒有報錯,而且能夠正常發送資料與單片機通信。
uj5u.com熱心網友回復:
弄個單例的類,類里提供串口開關方法,串口物件設成單例uj5u.com熱心網友回復:
在主表單里面創建操作串口的類,Form2,Form3增加建構式,新的建構式里面有引數為串口類,在建構式內把操作串口的物件保存到本地的區域變數里面主表單在生成Form2,Form3的時候把操作串口的物件通過建構式傳遞過去,這樣Form2,Form3就可以直接呼叫操作串口的物件了
uj5u.com熱心網友回復:
串口問題好像我這邊是解決的,通過在form1實體化一個serialport,這個問題應該是解決的。但是我在Form3中準備用modbus協議進行寫線圈時候,這個地方的master報錯
slaveAddress = byte.Parse("1");//從站地址
startAddress = ushort.Parse("3");//開始地址
master.WriteSingleCoil(slaveAddress, startAddress, false);//這個地方的master報錯
報錯原因:未將物件參考設定到物件的實體
//關于這個函式其他地方使用的
public static IModbusMaster master;
//關于這個函式源定義
namespace Modbus.Device
{
public interface IModbusMaster : IDisposable
{
ModbusTransport Transport { get; }
bool[] ReadCoils(byte slaveAddress, ushort startAddress, ushort numberOfPoints);
Task<bool[]> ReadCoilsAsync(byte slaveAddress, ushort startAddress, ushort numberOfPoints);
ushort[] ReadHoldingRegisters(byte slaveAddress, ushort startAddress, ushort numberOfPoints);
Task<ushort[]> ReadHoldingRegistersAsync(byte slaveAddress, ushort startAddress, ushort numberOfPoints);
ushort[] ReadInputRegisters(byte slaveAddress, ushort startAddress, ushort numberOfPoints);
Task<ushort[]> ReadInputRegistersAsync(byte slaveAddress, ushort startAddress, ushort numberOfPoints);
bool[] ReadInputs(byte slaveAddress, ushort startAddress, ushort numberOfPoints);
Task<bool[]> ReadInputsAsync(byte slaveAddress, ushort startAddress, ushort numberOfPoints);
ushort[] ReadWriteMultipleRegisters(byte slaveAddress, ushort startReadAddress, ushort numberOfPointsToRead, ushort startWriteAddress, ushort[] writeData);
Task<ushort[]> ReadWriteMultipleRegistersAsync(byte slaveAddress, ushort startReadAddress, ushort numberOfPointsToRead, ushort startWriteAddress, ushort[] writeData);
void WriteMultipleCoils(byte slaveAddress, ushort startAddress, bool[] data);
Task WriteMultipleCoilsAsync(byte slaveAddress, ushort startAddress, bool[] data);
void WriteMultipleRegisters(byte slaveAddress, ushort startAddress, ushort[] data);
Task WriteMultipleRegistersAsync(byte slaveAddress, ushort startAddress, ushort[] data);
void WriteSingleCoil(byte slaveAddress, ushort coilAddress, bool value);
Task WriteSingleCoilAsync(byte slaveAddress, ushort coilAddress, bool value);
void WriteSingleRegister(byte slaveAddress, ushort registerAddress, ushort value);
Task WriteSingleRegisterAsync(byte slaveAddress, ushort registerAddress, ushort value);
}
}
uj5u.com熱心網友回復:
你這個通訊介面IModbusMaster是在哪兒創建的,把它運用到全域單例,哪兒訪問都是一樣的。uj5u.com熱心網友回復:
我是在Form3視窗創建的,我試試你的方法,雖然我菜多查查資料,感覺是應該有效。uj5u.com熱心網友回復:
串口物件設成單例轉載請註明出處,本文鏈接:https://www.uj5u.com/net/224663.html
標籤:C#
上一篇:關于一個字串替換的問題
