(1)C#串口通信的例子,需要在线程里面执行。
private void Com2Ups40()
{
try
{
Logger.Info("执行函数Com2Ups40()------开始!!!");
//UpsMaiDiSi = new SerialPortManager();
serialPort = new SerialPort(_nameValueCollection["UPSMaiDiSi"], int.Parse(_nameValueCollection["UPSMaiDiSi_Rate"]), Parity.None, int.Parse(_nameValueCollection["UPSMaiDiSi_DataBit"]));
Logger.Debug("MainWinViewModel()->Com2Ups40()->" + "00000000000000000000");
serialPort.ReadTimeout = 2000;
if (!serialPort.IsOpen)
{
serialPort.Open();
}
Logger.Debug("MainWinViewModel()->Com2Ups40()->" + "444444444444444444444444444444");
master40 = ModbusSerialMaster.CreateRtu(serialPort);
//参数(分别为站号,起始地址,长度)
byte slaveAddress = 1;
ushort startAddress = 0;
ushort numberOfPoints = 70;
while (true)
{
ushort[] registerBuffer = null;
try
{
registerBuffer = master40.ReadInputRegisters(slaveAddress, startAddress, numberOfPoints);
}
catch (Exception ex)
{
Logger.Debug("MainWinViewModel()->Com2Ups40()->ReadInputRegisters()" + ex);
continue;
}
//解析
for (int i = 0; i < registerBuffer.Length; i++)
{
if(registerBuffer[20].ToString().Length > 1)
srES = (registerBuffer[20].ToString()).Substring(0, (registerBuffer[20].ToString()).Length - 1);
if (registerBuffer[24].ToString().Length > 1)
srST = (registerBuffer[24].ToString()).Substring(0, (registerBuffer[24].ToString()).Length - 1);
if (registerBuffer[16].ToString().Length > 1)
srTR = (registerBuffer[16].ToString()).Substring(0, (registerBuffer[16].ToString()).Length - 1);
if (registerBuffer[34].ToString().Length > 1)
scE = (registerBuffer[34].ToString()).Substring(0, (registerBuffer[34].ToString()).Length - 1);
if (registerBuffer[38].ToString().Length > 1)
scS = (registerBuffer[38].ToString()).Substring(0, (registerBuffer[38].ToString()).Length - 1);
if (registerBuffer[30].ToString().Length > 1)
scT = (registerBuffer[30].ToString()).Substring(0, (registerBuffer[30].ToString()).Length - 1);
}
Thread.Sleep(5000);
}
}
catch (Exception ex)
{
Logger.Debug("MainWinViewModel()->Com2Ups40()->" + ex);
}
}