色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 單片機(jī)寫串口上位機(jī)時(shí)的一點(diǎn)心得

          單片機(jī)寫串口上位機(jī)時(shí)的一點(diǎn)心得

          作者: 時(shí)間:2016-11-23 來(lái)源:網(wǎng)絡(luò) 收藏
          開(kāi)門見(jiàn)山地說(shuō),要注意的就是.net中無(wú)論String型還是Char型數(shù)據(jù),字符均使用Unicode編碼而非ASCII編碼,而單片機(jī)通常只支持ASCII編碼。這就導(dǎo)致在電腦與單片機(jī)串口通信過(guò)程中,出現(xiàn)無(wú)法被識(shí)別或被錯(cuò)誤識(shí)別的情況。

          前一陣做星火杯的時(shí)候,由于考慮到一些性能和功能上的需求,我決定用.net做上位機(jī),具體是用vb.net。因?yàn)橐郧敖佑|過(guò)VB,有點(diǎn)基礎(chǔ),所以學(xué)起來(lái)應(yīng)該不回花太多時(shí)間。在編程的時(shí)候邊編邊學(xué),進(jìn)展速度還算可以,最關(guān)鍵的數(shù)據(jù)庫(kù)查詢和操作的部分一個(gè)晚上也就搞定了。

          本文引用地址:http://cafeforensic.com/article/201611/320294.htm

          但最后做好后,與單片機(jī)通信時(shí)始終無(wú)法發(fā)送正確的數(shù)據(jù),表面上看好像是數(shù)據(jù)發(fā)送的順序不對(duì),導(dǎo)致我硬件上的12864液晶上顯示的數(shù)據(jù)雖然不是亂碼,但順序好像有點(diǎn)亂。我使用的是.net提供的SeriaPort控件的SerPort.Write()方法,無(wú)論發(fā)送的是一串string型數(shù)據(jù)還是將Char型數(shù)據(jù)一個(gè)一個(gè)的發(fā)送,均出現(xiàn)相同的狀況,時(shí)間一分一秒的過(guò)去,這可是真是急死我了!

          好在以前看書(shū)的時(shí)候不經(jīng)意間看到一句話“.net的字符均以Unicode編碼存儲(chǔ)”,也就是說(shuō),一個(gè)Char型數(shù)據(jù)占兩個(gè)字節(jié)。我想到這后馬上打開(kāi)MSDN,看看有什么解決方法??墒亲詈蟀l(fā)現(xiàn)那里也沒(méi)有什么很明確的答案。最后我又通過(guò)一系列的baidu,終于找到了解決方法,在這里就與大家分享一下。

          其關(guān)鍵不在與更改串口通信的某些設(shè)置和代碼,而在于給字符串進(jìn)行編碼轉(zhuǎn)換。一下就是我寫的一個(gè)函數(shù):

          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)”就是用來(lái)進(jìn)行編碼轉(zhuǎn)換的,在這里我把str1轉(zhuǎn)換為用ASCII編碼的字符,并存進(jìn)sendbyte()里。sendbyte是Byte型的,就和C語(yǔ)言中char型一樣,占用8個(gè)位(本來(lái)Byte的中文就是字節(jié)),可能大多數(shù).net愛(ài)好者對(duì)它接觸的不多,但跟單片機(jī)這些硬件打交道,是不可能不接觸Byte的。“Chr(sendbyte(i))”是用來(lái)將Byte里的數(shù)據(jù)作為一個(gè)數(shù)字,轉(zhuǎn)換為一個(gè)字符,在這里就是轉(zhuǎn)換為一個(gè)ASCII字符。不知道在這里我說(shuō)清楚了沒(méi)有。如果沒(méi)有說(shuō)清楚,那你也baidu一下吧。



          關(guān)鍵詞: 單片機(jī)串口上位

          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉