簡體   English   中英

arduino 從串行 rs232 中讀取十六進制

[英]arduino read hex from serial rs232 in

我從 rs232 Tx RX 讀取串行數據時遇到問題

我的代碼是

uint8_t cc;
char  rtx[MAX_LEN] = { 0 };
int   ii, lenn = 0;

    Serial.print("recv (HEX): ");
    Serial.println();
    while (mySerial.available())
    {
      cc = mySerial.read();
  
      if (cc < 0x10) Serial.print("0");
      Serial.print(cc, HEX);
      rtx[lenn] = cc; lenn++;
      Serial.print("");
    }
    
Serial.println();

在這里我可以看到我的輸出沒有問題

例如 output

recv (HEX): 
030039094C80703470326421A5713DFE01EA6B79AE8D9DBD94F523F95340217C739BCB3B75DE1D1EF09CF03D2F916AB390E92136074A41BBA4E95ACB

我想從外面打印 rtx 的問題

例如我用過這段代碼

char  buffer[MAX_LEN] = { 0 };
sprintf(buffer, "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",rtx[0],rtx[1],rtx[2],rtx[3],rtx[4],rtx[5],rtx[6],rtx[7],rtx[8],rtx[9],rtx[10],rtx[11],rtx[12],rtx[13],rtx[14],rtx[15],rtx[16],rtx[17],rtx[18],rtx[19],rtx[20]);
Serial.println(buffer); 

它只給出有限的錯誤數據

我懂了

0300FF39094FFFC807034FFF70326421A571

問題是在 out 中添加 FFF,我無法獲取所有 rtx[21]、rtx[22]、rtx[23]、rtx[23]、rtx[24]......

您的緩沖區需要兩倍大加上一個尾隨零字節:

uint8_t buffer[MAX_LEN*2 + 1] = { 0 };
sprintf(buffer, "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",rtx[0],rtx[1],rtx[2],rtx[3],rtx[4],rtx[5],rtx[6],rtx[7],rtx[8],rtx[9],rtx[10],rtx[11],rtx[12],rtx[13],rtx[14],rtx[15],rtx[16],rtx[17],rtx[18],rtx[19],rtx[20]);
Serial.println(buffer); 

這些值以字節存儲,但要將它們轉換為十六進制字符串,每個值需要 2 個字節/字符。

參數個數與格式字符串不匹配(21 個參數,20 個格式字符串)。

閱讀時,您必須檢查 MAX_LEN 以避免緩沖區溢出。


下面是一些讀取和顯示緩沖區的示例代碼:

#define MAX_LEN 100

uint8_t rtx[MAX_LEN] = { 0 };

ReadData();
PrintBuffer(20);


int ReadData()
{
    int lenn = 0;

    Serial.println("recv (HEX): ");

    while (mySerial.available()) {

        if (lenn >= MAX_LEN) {
            Serial.println();
            Serial.println("Buffer overflow");
            return(-1);
        }

        uint8_t cc = mySerial.read();
        PrintHexByte(cc);
        rtx[lenn++] = cc;
    }

    Serial.println();
    return(0);
}

void PrintBuffer(int len)
{
    if (len < 0 || len > MAX_LEN)
        len = MAX_LEN;

    for (int i = 0; i < len; ++i) {
        PrintHexByte(rtx[i]);
    }

    Serial.println();
}

void PrintHexByte(uint8_t cc)
{
    if (cc < 0x10)
        Serial.print("0");

    Serial.print(cc, HEX);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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