我们的工作中用到一个磁卡传感器,通过串口通讯。微机不断地往串口写一串指令码(读卡指令码),该传感器就会立刻返回一串代码作为回应。如果没有磁卡接触传感器,则回应吗为:"\nA1F3C\r",若有磁卡接触传感器,则回应码为:"\nA1F0007CA32901\r",但我们在serialPort_DataReceived()事件代码中接收有磁卡接触回应码时却总是收到"\nA1F0007",即8个字符,后面的却收不到,造成接收数据不全,代码如下:
string message = "";
message = serialPort.ReadExisting();               
if (message.Substring(0, 7) == "\nA1F3C\r" && message.Length == 7)
{
    serialPort.DiscardInBuffer();             //清除接收缓冲区
    serialPort.DiscardOutBuffer();
    return;
}              
MessageBox.Show(message);  //message显示的是 \nA1F0007总是得不到完整的回应码,请问该如何解决此问题?谢谢各位!

解决方案 »

  1.   

    上一个还没结贴,就又来了。
    ReadExisting()方法读取的时候,接收缓冲区中还没有收到\nA1F0007CA32901\r这个完成的串,看你的情形只是收到\nA1F0007你就读取了,当然不可能读取完整。你先理解用什么方法的使用,至于怎么读取,在上一贴我已经说过类似的方法了。
      

  2.   

    试试请求指令码后面加\r 或用WriteLine() 去写入,可能你的指令码有问题
      

  3.   

    有可能两方面原因:serialPort1.ReceivedBytesThreshold属性设置不对,提前触发了事件,看一下收到的内容是不对还是不全。看到你的数据是不全,基本就是这个原因,设置这个属性为设备发送数据的字节数就行了
      

  4.   

    看你的需求,用这个serialPort_DataReceived()事件,加串口ReceivedBytesThreshold属性设置,很难达到,因为你读取的结果不固定,而且它还是异步处理。
    你的需求是这种“一问一答”,建议你使用串口同步写入后立即读取,读取到的内容开头和结尾标志明显,很好处理。
      

  5.   

    你可以让线程休息一会,判断是否是应该收到的“\nA1F0007CA32901\r”的长度
      

  6.   

     int Len = serialPort.BytesToRead;//获取字节长度                  if (Len < 1)
                    {
                         return;
                    }                 byte[] data = new byte[Len];
                    serialPort.Read(data, 0, Len);  //从串口读取信息,此处读取的数据为byte,所以得转换成字符串,方法如下/// <summary>
            /// 将Byte转换成字符串
            /// </summary>
            /// <param name="data"></param>
            /// <returns></returns>
            public static string Getstring(byte[] data)
            {
                string str = Encoding.GetEncoding("GB2312").GetString(data);
                return str;
            }