[英]Check sum and serial port communication
我正在嘗試從USB到串口轉換器發送一條帶有校驗和的消息,然后再返回一次。 但由於某種原因,我無法使它正常工作,即使我嘗試了一天。 我開始認為硬件出了點問題,但是我認為在放棄之前詢問大家是個好主意...我正在使用cygwin在Windows計算機上執行和編譯程序。
我希望在程序運行時附加終端的圖片,但是您必須擁有> 10的信譽,我不是:(。所以我將不得不描述它.....我得到了當我嘗試發送“ a”時,從終端獲得以下信息。
輸入消息:
您的郵件要發送的校驗和是:97
您要發送的消息是:
一種@
收到的消息的校驗和是:97
消息未正確接收!
您收到以下信息:
一種@
我收到了發送的郵件,但“ a”的校驗和應該為“ a”,對嗎? 因此,應該發送的字符串是“ aa”而不是“ a”
a @”還是我在這里完全迷路了。
我已在下面附加了代碼的相關部分(printWhite()等。更改了文本的顏色,僅此而已)
void main(){
regularSend();
regularReceive();
}
void regularSend(){
char buff2s[20];
unsigned char calculatedCS;
printf("Enter a message: ");
fgets(buff2s,15,stdin); // string input from keyboard
calculatedCS=checkSum(buff2s,strlen(buff2s));
printf("The checksum for your message to send is: %i\n",calculatedCS);
buff2s[strlen(buff2s)]=calculatedCS; //adds a checksum
buff2s[strlen(buff2s)]='\0'; //adds a new string terminator
printf("Your message to send is: %s\n",buff2s);
bytes_written=write(fd,buff2s,strlen(buff2s));
sleep(1);
}
void regularReceive(){
unsigned char buffR[20];
unsigned char rCS;
bytes_read=read(fd,buffR,sizeof(buffR)-1);
if(strlen(buffR)<1){
printRed();
printf(" No reply from the serial device! \n");
printWhite();
}
else{
rCS=checkSum(buffR,strlen(buffR)-2); //1 byte extra now
printf("The checksum of the received message is: %i\n", rCS);
true_or_false=check_checkSum(buffR,strlen(buffR)-1);
if(true_or_false==1){
buffR[strlen(buffR)-1]='\0'; //removes checksum
printf("Your message was: %s\n",buffR);
}
else{
printRed();
printf("The message wasn't properly received!\n");
printWhite();
printf("You received the following: %s\n\n",buffR);
}
}
}
unsigned char checkSum(char buff[], unsigned char nbrOfBytes){
unsigned char ic;
unsigned int t_cSum=0;
for (ic=0;ic<nbrOfBytes-1;ic++){
t_cSum=t_cSum+buff[ic];
}
return (unsigned char) t_cSum; //returns a 8bit checksum
}
unsigned char check_checkSum(char buffR_t[], unsigned char nbrOfBytes){ //<- check this
unsigned char r_cSum=checkSum(buffR_t,nbrOfBytes-1); //calculates the expected value of the checksum byte
if(r_cSum==(unsigned char)buffR_t[nbrOfBytes-2]){
printGreen();
printf("A message has been received! \n");
printWhite();
return 1;
}
else{
return 0;
}
}
有人可以發現我的錯誤嗎(我幾乎可以肯定至少有2個錯誤)? 我將不勝感激! 最好的問候亨里克
buff2s[strlen(buff2s)]=calculatedCS; //adds a checksum
buff2s[strlen(buff2s)]='\0'; //adds a new string terminator
不好:-(
僅僅因為您的字符串具有空終止符,並不意味着它在整個過程中都為空。 您的第一個“ strlen”會告訴您當前的結束位置。 您可以用校驗和覆蓋它,但是“新終止符”可能在任何地方。 改為這樣做。
int len = strlen(buff2s);
buff2s[len]=calculatedCS; //adds a checksum
buff2s[len+1]='\0'; //adds a new string terminator
(理想情況下,還要檢查緩沖區溢出...)
正如@Roddy指出的那樣,代碼很不好,因為它會用校驗和覆蓋字符串的\\0
,然后嘗試在可能未終止的字符串的下一行中查找字符串長度!
buff2s[strlen(buff2s)]=calculatedCS; //adds a checksum
buff2s[strlen(buff2s)]='\0'; //adds a new string terminator
建議:
size_t len = strlen(buff2s);
calculatedCS = checkSum(buff2s, len);
buff2s[len] = calculatedCS; //adds a checksum
buff2s[++len] = '\0'; //adds a new string terminator
bytes_written=write(fd, buff2s, len + 1);
由於使用字符串,請更改校驗和生成器和檢查器以確保其不會創建'\\0'
。
unsigned char checkSum(char buff[], size_t nbrOfBytes){
size_t ic;
unsigned int t_cSum = 0;
for (ic=0; ic<nbrOfBytes-1; ic++){
t_cSum += buff[ic];
}
return (unsigned char) (t_cSum % 255 + 1);
}
RegularReceive()
將不起作用。 建議通過fgetc()
讀取,直到出現'\\0'
為止。 (或超時或緩沖區已滿)。 特別地,以下內容很危險,因為不知道buffR
以'\\0'
結尾並且下一個函數是strlen(buffR)
。
bytes_read = read(fd, buffR, sizeof(buffR)-1);
if(strlen(buffR)<1){
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.