首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

串口接收,线程里还是 有点小疑点

2012-08-15 
串口接收,线程里还是 有点小问题lizhibin11 根据提供的,稍作修改在线程里打断点,一直按F5,解包正常。但是,

串口接收,线程里还是 有点小问题
lizhibin11 根据提供的,稍作修改

在线程里打断点,一直按F5,解包正常。

但是,当去掉断点后,,全速跑,就出问题了

下面是测试按钮里,模拟ARM板发送数据包,也就是自发自收(串口2,3短接即可)

按下按钮,,线程启动,,一直接收数据,(其实,我按钮就按一下,也就说了一次而)

第一个问题就是如下:

C# code
 while (true)            {                int recvlen = comm.Read(buffer, offset, count);          // count ,不知道哪里给改变成 负值了



第二个问题,,就我模拟的数据,在第一次遍历完了,以后,再读串口缓存,应该全是“0”才对呀
但是断点走时,,发现还是有数据的,很奇怪。



C# code
 private void button6_Click(object sender, EventArgs e)        {            int n;                        byte[] sendbyte = { 0xF0, 0x03, 0x7E, 0x01, 0x8E, 0x70, 0x01, 0x17, 0x01, 0x06, 0x00, 0x00, 0xFF, 0xFF, 0x01, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x42, 0x70, 0x01, 0x17, 0x01, 0x06, 0x00, 0x00, 0xFF, 0xFF, 0x01, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x76,0xF0, 0x03, 0x7E, 0x03, 0x8B};                       ThreadPool.QueueUserWorkItem(recv2, comm);            while (true)            {                comm.Write(sendbyte, 0, sendbyte.Length);                n = sendbyte.Length;                send_count += n;//累加发送字节数                labelSendCount.Text = "Send:" + send_count.ToString();//更新界面            }        }



C# code
static void recv2(object obj)        {            SerialPort comm = (SerialPort)obj;            byte[] buffer = new byte[256];            int offset = 0;            int count =2;            while (true)            {                int recvlen = comm.Read(buffer, offset, count);                                if (recvlen != count)                {                    offset += recvlen;                    count -= recvlen;                    continue;                }                if (offset < 2)                {                    if (buffer[0] == 0xf0)                    {                        offset = 2;                        count = buffer[1];                        continue;                    }                    if (buffer[0] == 0x70)                    {                        offset = 2;                        count = 1;                        continue;                    }                }                if (offset < 3)                {                    offset = 3;                    if (buffer[0] == 0x70)                    {                         count = buffer[2] - 3;                     }                    else                    {                        count = buffer[1] - 3;                    }                    continue;                }                int len = 0;                if (buffer[0] == 0xf0)                    len = 2 + buffer[1];                else                    len = buffer[2];                //显示buffer从0到len的内容                offset = 0;                count = 2;            }        }


[解决办法]
有数据是正常的,每次读完之后,buffer中0到len就是所要的数据,buffer不需要clear,每次读数据都会重写他。
第一个count会变成负值,说明读取某一个包的长度这个字节时发生了错误,两种可能,我的代码有问题或者协议不准确。
[解决办法]
while中不停地 Write,那么线程中随时都有可能读到数据,你至少应该给线程加个lock吧,write和read不要交叉

热点排行