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

【C#】串口通讯方面

2013-03-27 
【C#】串口通信方面。如题,一个界面有许多按钮,通过点击按钮向单片机发送命令,然后得到单片机返回命令。比如我

【C#】串口通信方面。
如题,一个界面有许多按钮,通过点击按钮向单片机发送命令,然后得到单片机返回命令。
比如我发送的是加电开关,返回电压、电流等。然后通过解析将数据显示在同页面的其他textBox(不要不断刷新,大概一两秒一次)。
问题来了,接受的数据是一个BYTE的形式来的,我需要的命令是FD开头,AA结尾,13位的一段Byte。
怎么能让单片机传送过来的数据按照这个形式保存进来,因为单片机发送的命令是断断续续的,这次没传完,下次接着传,我判断第一位是FD,然后拼接后12的方法也不行,同时只能显示两个TextBox,多了的话就数据就卡住不动。这个原因是什么,是没解析对数据还是什么。。
求人啊【C#】串口通讯方面
[解决办法]
每次数据到达后,加上之前接收的包进行数据的完整性判断,再做处理。

至于你的卡是因为没有合理的利用线程和异步。

[解决办法]
 BitArray bit = new BitArray(16);//0-15
            string ac = Units.ConvertString(MIO.ToString(), 10, 2);
            for (int i = 0; i < ac.Length; i++)
            {
                bit[15 - i] = ac.Substring(ac.Length - 1 - i, 1) == "1" ? true : false;
            }
            chbADk.Checked = bit[15];//
            chbAF.Checked = bit[14];//
希望对你有帮助
[解决办法]
为什么要延时500ms?
如果要延时,应该在数据处理结束了,再延时


           string ret = string.Empty;
           data = null;

           try
           {

               bool bGet = false;
               string received =string.Empty;
               int nTimeout = 0;
               do
               {
                   received += m_Serial.ReadExisting();


                   if (received.IndexOf("\x03") >= 0)//这个地方要换成你的结束符
                   {
                           bGet = true;
                           //你的数据处理......
                   }
                   
                   nTimeout++;



                   if (nTimeout > 100)
                   {
                       bGet = true;
                   }
                   Thread.Sleep(1);
               }
               while (!bGet);
           }
           catch
           {

           }

           return ret;


[解决办法]
我做过类似的 卡主 是因为 你接收的程序有问题。。。
 我给你打个例子。。。
1.首先添加控件。。。。serialPort1。。。C#自带的控件
2.然后消息响应,也就是事件。。在serialPort1的属性事件里面有。点击出来
 函数的名字是:  private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
3.这个函数要用到委托。。。
4.我给你写个例子:
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)

{
int length = serialPort1.BytesToRead;
            byte[] data = new byte[length];
            
            for (int i = 0; i < length; i++)
            {
                data[i] = (byte)serialPort1.ReadByte();
          
            }
            string str = ToHexString(data);

            this.textBox2.Invoke((EventHandler)(delegate
                {
                 this.textBox2.AppendText(str.ToString());
  
                }
            ));
}

其中ToHexString是16进制转换的 函数

最重要的地方 是这个委托delegate
  可以随便加东西
[解决办法]
串口通信的话,楼主可以把串口收到到的数据先拷贝到一段数据缓存中,两个字节两个字节的解析这段缓存,如果收到你的数据头FD后,指针偏移到你的数据区长度后一位,看是否是AA(测试数包是否异常),如果是把中间数据拷贝下来解析,直到最后改缓存全部解析完毕

热点排行