開門見山地說,要注意的就是.net中無論String型還是Char型數(shù)據(jù),字符均使用Unicode編碼而非ASCII編碼,而單片機通常只支持ASCII編碼。這就導(dǎo)致在電腦與單片機串口通信過程中,出現(xiàn)無法被識別或被錯誤識別的情況。 前一陣做星火杯的時候,由于考慮到一些性能和功能上的需求,我決定用.net做上位機,具體是用vb.net。因為以前接觸過VB,有點基礎(chǔ),所以學(xué)起來應(yīng)該不回花太多時間。在編程的時候邊編邊學(xué),進展速度還算可以,最關(guān)鍵的數(shù)據(jù)庫查詢和操作的部分一個晚上也就搞定了。
本文引用地址:http://m.butianyuan.cn/article/201611/320294.htm 但最后做好后,與單片機通信時始終無法發(fā)送正確的數(shù)據(jù),表面上看好像是數(shù)據(jù)發(fā)送的順序不對,導(dǎo)致我硬件上的12864液晶上顯示的數(shù)據(jù)雖然不是亂碼,但順序好像有點亂。我使用的是.net提供的SeriaPort控件的SerPort.Write()方法,無論發(fā)送的是一串string型數(shù)據(jù)還是將Char型數(shù)據(jù)一個一個的發(fā)送,均出現(xiàn)相同的狀況,時間一分一秒的過去,這可是真是急死我了!
好在以前看書的時候不經(jīng)意間看到一句話“.net的字符均以Unicode編碼存儲”,也就是說,一個Char型數(shù)據(jù)占兩個字節(jié)。我想到這后馬上打開MSDN,看看有什么解決方法??墒亲詈蟀l(fā)現(xiàn)那里也沒有什么很明確的答案。最后我又通過一系列的baidu,終于找到了解決方法,在這里就與大家分享一下。
其關(guān)鍵不在與更改串口通信的某些設(shè)置和代碼,而在于給字符串進行編碼轉(zhuǎn)換。一下就是我寫的一個函數(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)”就是用來進行編碼轉(zhuǎn)換的,在這里我把str1轉(zhuǎn)換為用ASCII編碼的字符,并存進sendbyte()里。sendbyte是Byte型的,就和C語言中char型一樣,占用8個位(本來Byte的中文就是字節(jié)),可能大多數(shù).net愛好者對它接觸的不多,但跟單片機這些硬件打交道,是不可能不接觸Byte的。“Chr(sendbyte(i))”是用來將Byte里的數(shù)據(jù)作為一個數(shù)字,轉(zhuǎn)換為一個字符,在這里就是轉(zhuǎn)換為一個ASCII字符。不知道在這里我說清楚了沒有。如果沒有說清楚,那你也baidu一下吧。
評論