开门见山地说,要注意的就是.net中无论String型还是Char型数据,字符均使用Unicode编码而非ASCII编码,而
单片机通常只支持ASCII编码。这就导致在电脑与单片机
串口通信过程中,出现无法被识别或被错误识别的情况。
前一阵做星火杯的时候,由于考虑到一些性能和功能上的需求,我决定用.net做上位机,具体是用vb.net。因为以前接触过VB,有点基础,所以学起来应该不回花太多时间。在编程的时候边编边学,进展速度还算可以,最关键的数据库查询和操作的部分一个晚上也就搞定了。
但最后做好后,与单片机通信时始终无法发送正确的数据,表面上看好像是数据发送的顺序不对,导致我硬件上的12864液晶上显示的数据虽然不是乱码,但顺序好像有点乱。我使用的是.net提供的SeriaPort控件的SerPort.Write()方法,无论发送的是一串string型数据还是将Char型数据一个一个的发送,均出现相同的状况,时间一分一秒的过去,这可是真是急死我了!
好在以前看书的时候不经意间看到一句话“.net的字符均以Unicode编码存储”,也就是说,一个Char型数据占两个字节。我想到这后马上打开MSDN,看看有什么解决方法。可是最后发现那里也没有什么很明确的答案。最后我又通过一系列的baidu,终于找到了解决方法,在这里就与大家分享一下。
其关键不在与更改串口通信的某些设置和代码,而在于给字符串进行编码转换。一下就是我写的一个函数:
Public Sub AsciiSend(ByVal SerPort1 As IO.Ports.SerialPort, ByVal str1 As String)
Dim i As Integer
Dim sendbyte As Byte()
sendbyte = System.Text.Encoding.ASCII.GetBytes(str1)
For i = 0 To str1.Length - 1
SerPort1.Write(Chr(sendbyte(i)))
Threading.Thread.Sleep(2)
Next
End Sub
其中“sendbyte = System.Text.Encoding.ASCII.GetBytes(str1)”就是用来进行编码转换的,在这里我把str1转换为用ASCII编码的字符,并存进sendbyte()里。sendbyte是Byte型的,就和C语言中char型一样,占用8个位(本来Byte的中文就是字节),可能大多数.net爱好者对它接触的不多,但跟单片机这些硬件打交道,是不可能不接触Byte的。“Chr(sendbyte(i))”是用来将Byte里的数据作为一个数字,转换为一个字符,在这里就是转换为一个ASCII字符。不知道在这里我说清楚了没有。如果没有说清楚,那你也baidu一下吧。