簡體   English   中英

檢查和和串口通訊

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM