本帖最后由 yohoboy 于 2022-1-27 10:20 编辑
最近測試一個單晶片機板,使用串口測試軟體模擬單晶片去接收串口傳來之資料。
發現校驗值如果大於ASCII值 128到255 值時,會產生錯誤,讓單晶片機板無法運作(因校驗和不對)。
因此想請教如何寫法讓資料格式是正確的。感謝大德的幫助。
以下附上簡易代碼;Include the Serial UDF
#include 'CommMG.au3'
#include <StringConstants.au3>
#include <MsgBoxConstants.au3>
#include <Array.au3> ; _ArrayDisplay() 函数所需的包含文件.
Global $sportSetError = ''
Global $CMPort = 3 ; Port
Global $CmBoBaud = 9600 ; Baud
Global $CmboDataBits = 8 ; Data Bits
Global $CmBoParity = "none" ; Parity
Global $CmBoStop = 1 ; Stop
Global $Text_Xor = ""
Global $setflow = 2 ; Flow ..... IS THIS CORRECT
;Local $Input_Word = Chr(2) & "___c____TXC14YC~F0~M01~D1~S1~P0訊息測試t~F0~M01~D1~S1~P0TESTM1" ;
Local $Input_Word = Chr(2) & "___c____TXC14YC~F0~M01~D2~S2~P0訊息測試t~F0~M01~D2~S2~P0Message Test.T007S01s30M1"
Local $Send_Temp = Check_code($Input_Word)
$Send_Temp &= Chr(3) ;加入chr(3) 完成串口傳輸
;ClipPut($Send_Temp) ;用HxD 軟體開並貼上用於顯示ASCII值
_CommSetPort($CMPort, $sportSetError, $CmBoBaud, $CmboDataBits, $CmBoParity, $CmBoStop, $setflow)
_CommSendstring($Send_Temp)
_CommSendByte($Text_Xor) ;用以對比chr(3)值前第二個byte 值是否正確,如附圖一(Xor值.jpg)
_CommClosePort()
Func Check_code($Input_Text)
$Text_Xor = ""
Local $Output_Text =""
$Text_Len = StringLen($Input_Text)
$Text_Array_Temp = StringToASCIIArray($Input_Text,0,$Text_Len,$SE_ANSI)
;_ArrayDisplay($Text_Array_Temp)
;$Text_Array_columns = UBound($Text_Array_Temp,$UBOUND_ROWS )
;MsgBox(0,"$Text_Array_columns",$Text_Array_columns)
for $i = 0 to ( UBound($Text_Array_Temp) - 1) Step 1 ;計算校驗碼,採用Xor值計算
;MsgBox(0,"$Text_Array_Temp[$i]",chr($Text_Array_Temp[$i]))
$Text_Xor = BitXOR($Text_Xor,($Text_Array_Temp[$i]))
Next
MsgBox(0,"$Text_Xor值",$Text_Xor & @CRLF & "Ascii字串顯示:"& chr($Text_Xor) & @CRLF & "unicode字串顯示:" & chrw($Text_Xor))
If $Text_Xor <= 32 Then ;如果Xor 值小於32 (控制符)
$Output_Text = $Input_Text & Chr( ($Text_Xor + 32)) & "0" ;將小於Xor值加上32值 改為一般字符類型,並加入識別碼 0 值,測試成功
ElseIf $Text_Xor >= 128 Then
;MsgBox(0,"",CHR($Text_Xor))
$Output_Text = $Input_Text & Chrw($Text_Xor) & "0" ;大於128-ASCII值,並加入識別碼 0 值,卡在無法傳送大於Ascii值128以上到255
Else
$Output_Text = $Input_Text & Chr($Text_Xor) & "0" ;直接輸出,並加入識別碼 0 值,測試成功
EndIf
MsgBox(0,"輸出訊息",$Output_Text)
Return $Output_Text
EndFunc
|