int sum = commDev.BytesToRead();
while (sum > 0)
{
iRead = commDev.ReadByte();
if (iRead
{
break;
}
switch (dev.AddByte((byte)iRead))
{
case enDeviceResult.通讯结束:
DeviceList.RemoveAt(0);
if (DeviceList.Count == 0)
{
commDev.Close();
}
commFlag = CommFlag.Idle;
tTicks = DateTime.Now.Ticks;
break;
case enDeviceResult.校验错误:
commFlag = CommFlag.Encoding;
tTicks = DateTime.Now.Ticks;
break;
case enDeviceResult.校验正确:
commFlag = CommFlag.Encoding;
iRetry = 1;
tTicks = DateTime.Now.Ticks;
break;
default:
break;
}
}
//if (((DateTime.Now.Ticks - tTicks) >= 20000000) && (commFlag == CommFlag.Rx))
//{
// if (iRetry == 0)
// {
// commFlag = CommFlag.Idle;
// if (DeviceList.Count == 0)
// {
// if (CommMessage != null)
// {
// CommMessage(this, "通讯设备已清空!");
// }
// break;
// }
// DeviceList.RemoveAt(0);
// if (DeviceList.Count == 0)
// {
// commDev.Close();
// }
// }
// else
// {
// iRetry--;
// commFlag = CommFlag.Encoding;
// }
//}
break;
}
}
}
3、子线程中两个读取串口的方法
SerialPort spComm = new SerialPort();
public int BytesToRead()
{
if (spComm.IsOpen == false)
{
Close();
return -1;
}
return spComm.BytesToRead;
}
public int ReadByte()
{
if (spComm.IsOpen == false)
{
Close();
return -1;
}
return spComm.ReadByte();
问题:要采集的电表是DL645_97协议的(浙江立新),波特率是1200,偶校验。
(1)电表波特率低,可能返回的比较少,第一次只读取了3字节。
有时候是“254 254 104”,这个是正确的。
有时候是“254,254,232”,这个应该是错误的,不明白232是什么意思?
(2)读完前三个字节,再次循环去读取数据的时候,数据读不到了。 读不到数据“貌似这个读数据的线程”会退出,以为主窗体重新显示了,跳出了断点,Why??? 也就是第四次执行“ReadByte()”的时候,主窗体就会重新跳出来(开始的时候已经出来了)。
(3)用串口调试助手手动发送报文,返回报文是没有问题的,20个字节,很完整,而且响应很快,1秒内完成。
为什么自己写的程序去读串口一次只能读三字节。就算放大了线程Sleep的时间(5分钟),会变成四字节,第一个字节还不正确,不是“FEH”。
(4)第四次执行“ReadByte()”的时候,主窗体就会重新跳出来(开始的时候已经出来了)。这不是说明没有读到字节,读数据的这个线程自动终止了???
(5)改怎么样才能读取到完整的返回报文? 应该修改那里呢?
}