簡體   English   中英

通過串行從C向arduino發送數據時,我應該做任何轉換嗎?

[英]Should I be doing any casting while sending data from C to arduino over serial?

我的設置:

Android設備=(WiFi)=> Linksys路由器(WRT54G)=(串行)=> Arduino

Android設備:使用套接字IO-連接到路由器
Linksys路由器:Linux套接字IO-接受客戶端
Arduino:從路由器串行讀取數據。 我已經在路由器上焊接了一個串行端口。

串行buad速率為9600,因此一切保持同步。

問題:
我可以看到服務器將數據正確地打印到控制台,但是在Arduino控制台中看到奇怪的字符。 這是我看到的:

在Android設備上: up

路由器控制台:

<Received : up

Arduino控制台:

received: BELBELBELBELBELBELBELBELBELBELBELBELBELBELBEL up 
received: 

我不知道這個BEL角色來自哪里?

我的實驗:
如果我從路由器控制台窗口執行此操作:

$> echo "hello" > /dev/tts/1

我在Arduino端獲得了正確的數據,即:

received: hello
received:

我的代碼:
路由器代碼

int fd;
char *portname = "/dev/tts/1";

fd = open(portname, O_WRONLY);

if (fd < 0)
{
    printf("Error : cannot open port %s\n", portname);
    return -1;
}
...
    connfd = accept(listenfd, (struct sockaddr*)&serv_addr, &len);
    printf("accept OK!\n");
    printf("accepted connection from %s\n", inet_ntoa(serv_addr.sin_addr));

    char rcvbuf[MAX_BUFF_SIZE] = { '\0' };

    while(1)
    {
        int inData = recv(connfd, rcvbuf, sizeof(rcvbuf), 0);


        if (inData <= 0)
        {
         printf("Client closed!\n");
         break;
        }

        int result = write(fd, rcvbuf, strlen(rcvbuf));

        printf("<Received : %s\n", rcvbuf);

        // reset memory otherwise we will have data
        // from previous data
        bzero((char *)rcvbuff, sizeof(rcvbuf));
     }

...

Arduino代碼:

// the loop routine runs over and over again forever:
void loop() {

        while (Serial.available() > 0)
        {
          char inChar = (char)Serial.read();

          if (inChar == '\n' || inChar == '\r' || inChar == '\n\r' || inChar == '\r\n')
          {
            DATA_READ = true;
            break;
          }

          inputString += inChar;          
        }        
        // send data only when you receive data:
        if (DATA_READ) 
        {
          if (inputString[0] != ' ' || inputString[0] != '\n')
          {
            Serial.print("received: ");
            Serial.println(inputString + " " + inputString[0]);

            process_message(inputString[0]);

            // prepare for next round
            DATA_READ = false;

            Serial.flush();
            inputString = "";
          }
        }        
}

任何*指針將不勝感激:)

編輯
添加了更多信息的波特率:路由器

root @ OpenWrt:/ usr / bin#stty -F / dev / tts / 1 -a
速度9600波特 第0行; 列0; 行= 0; intr = ^ C; 退出= ^ \\; 擦除= ^ ?; 殺= ^ U; eof = ^ D; eol =; eol2 =; swtch =; 開始= ^ Q; 停止= ^ S; susp = ^ Z; rprnt = ^ R; werase = ^ W; lnext = ^ V; 沖洗= ^ O; 最小值= 1; 時間= 0;

的Arduino:

  Serial.begin(9600);

  delay(50);

當您使用Android應用發送時,您確定從路由器寫入arduino的數據中是否有換行符? 我不確定是否是您的錯誤的原因,但我建議:

  1. 在Android(或服務器)中添加“ \\ n”。
  2. 如果您希望在arduino中使用ascii字符,請確保android應用(java?)正在發送ascii字符。
  3. 在服務器中寫入時,請使用int inData作為長度。 檢查其長度是否合理。
  4. 檢查int result是否有錯誤,並與inData比較

暫無
暫無

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

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