您的位置 首页 观点

单片机写串口上位机时的一点心得

开门见山地说,要注意的就是net中无论String型还是Char型数据,字符均使用Unicode编码而非ASCII编码,而单片机通常只支持ASCII编码。这

开门见山地说,要注意的便是.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一下吧。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/guandian/261148.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部