使用serialport类,如何判断接收的数据已经中断?
之前发过一次贴,简单测试以为可以了,实际还是不行。具体要求如下:
使用serialport类接收串口数据(串口数据是由与计算机相连的一台仪表以固定格式连续发送的),现在接收数据已正常,但是不知怎样判断串口数据已中断。(此处我所说的串口数据中断,是指由于串口rs232连接线路中断,或与计算机连接的仪表已关闭停止向计算机发送数据)。
之前发帖求助,得到的用serialPort.BytesToRead=0 得到缓冲字节长度,只能在serialPort打开时判断有效,如果起初接收正常,突然中断了串口的数据传输,用这个方法依旧不能得到正确结果。 --------------------编程问答-------------------- if(serialPort.BytesToRead==0) --------------------编程问答-------------------- 将上面的语句放在 serialPort1_DataReceived事件当中, --------------------编程问答-------------------- private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
byte r_byte;
while (serialPort1.BytesToRead != 0)
{
r_byte = Convert.ToByte(serialPort1.ReadByte());
switch (r_flag)
{
case 0:
if (r_byte == 0xaa)
{
r_flag += 1;
serial_input[0] = r_byte;
}
break;
case 1:
if (r_byte == 0xaa)
{
r_flag += 1;
serial_input[1] = r_byte;
r_count = 0;
}
else
{
r_flag = 0;
r_count = 0;
}
break;
case 2:
serial_input[r_count + 2] = r_byte;
r_count += 1;
if (serial_input[2] != 0xd0)
{
if (r_count == 4)
{
r_flag = 0;
r_count = 0;
rs_cl();//调用接收处理函数
}
}
else
{
if (r_count == 0x14)
{
r_flag = 0;
r_count = 0;
rs_cl();//调用接收处理函数
}
}
break;
}
}
} --------------------编程问答-------------------- 学习 --------------------编程问答--------------------
这个方法我用了,代码如下:
在serialPort_DataReceived事件中:
try
{
if (czSerialPort.BytesToRead == 0)
{
strczData = "Error";
}
else
{
//定义接收数据长度
int bytesRead = czSerialPort.BytesToRead;
byte firstbyte = Convert.ToByte(czSerialPort.ReadByte());
//判断第一个字节是否是起始位:16进制的0x02
if (firstbyte == 0x02)
{
byte[] bytesData = new byte[bytesRead];
for (int i = 0; i <= bytesRead - 2; i++)
{
byte byteData = Convert.ToByte(czSerialPort.ReadByte());
//判断数据结束字节
if (byteData == 0x03)
continue;
bytesData[i] = byteData;
}
//将字节数组转换成字符串
strczData = System.Text.Encoding.Default.GetString(bytesData);
//截取数据(舍去校验和等字符)
strczData = strczData.Remove(7);
//通过捕获异常来转换接收到的字符串
try
{
int intczData = Convert.ToInt32(strczData);
strczData = Convert.ToString(intczData);
}
catch
{
strczData = "Error";
}
}
}
catch (exection czerror)
{
MessageBox.Show(czerror.Message);
}
在代码中加入了你说的判断仍旧不行。 --------------------编程问答-------------------- 实时检查连接标志位,异常断开时就读取数据,这样行吗 --------------------编程问答-------------------- 你可以可以用API写,这样就有延时参数可以用了 --------------------编程问答-------------------- 晕老在这个问题你还没解决??
做个标记明天给你个点代码。 --------------------编程问答-------------------- SERIALPORT_DATARECEIVED 怎么触发啊,我的每次都不执行啊?
--------------------编程问答-------------------- mark,明天过来学习代码 --------------------编程问答-------------------- 好 --------------------编程问答--------------------
是不是忘了啊,代码呢?问题还没有解决
补充:.NET技术 , C#