来自第三方平台的Arduino串行通信

时间:2016-06-04 01:03:30

标签: c++ boost arduino boost-asio

我正在设计一个串行通信平台,该平台从使用Boost.Asio的c ++代码发送数据,并通过Arduino接收。

我的测试程序结构只是一个回显程序:计算机将一些字符发送到Arduino,Arduino将字符发送回计算机,async_read是它们。

我接近异步进行良好的沟通,但一个问题仍然存在。披露:我的波特率是匹配的,至少在两个程序中是这样。我的问题是,每当我以9600以外的波特率发送数据时,在将数据从Arduino回送到计算机之间会发生某种错误。一条未知字符附加到邮件的开头,在某些情况下,会附加两个未知字符。

看起来这可能与启动和停止位有某种形式的同步问题,但我不确定。任何人都可以建议我应该检查的东西(除了我的波特率,确实匹配)?我不知道应该在哪里寻找问题。

计算机端的回声程序:

#ifndef IOSTREAM_H
#include <iostream>
#endif
#ifndef SERIAL_H
#include "serial.h"
#endif
#include <time.h>
#define PORT "/dev/tty.usbmodem1411"

int main(){
    std::clock_t t;
    t = std::clock();
    boost::asio::io_service io;
    Serial::Serial serial(PORT, &io, 19200);
    if(!serial.is_open()){
      serial.open(PORT);
    }
    std::string s = "hellomynameiswill~";
    serial.async_write(s);
    serial.async_read_until("\n");
    io.run();
    t = std::clock() - t;
    std::cout << "Execution time:" << ((float)t)/CLOCKS_PER_SEC << std::endl;
}

Arduino方面的回声计划:

boolean isSerial = false;

void setup() {
  pinMode(13, OUTPUT);
    Serial.begin(9600);
}

void loop() {
  isSerial = false;
  while(Serial.available() > 0){
//    delay(1);
    char byteRead = Serial.read();
    isSerial = true;
    while(byteRead != 126){
      if(Serial.available() > 0){      
        Serial.print(byteRead);
        byteRead = Serial.read();
      }
    }
    if(isSerial){
      Serial.print('\n');
    }
  } 
}

我在echo程序上收到的输出波特率不是9600,总是"?hellomynameiswill~""??hellomynameiswill~"。后者的输出更常见。我正在使用Arduino Uno。

编辑2:?在转换为ascii值时,序列开头是负整数。我还不确定如何处理这个问题。 编辑3:?在序列的开头可以追溯到arduino的消息的原始boost :: asio :: async_write。在boost :: asio :: async_write和boost :: asio :: write之间交替对输出的文本没有区别。

1 个答案:

答案 0 :(得分:0)

经过一番研究后发现,当程序首次打开时,会在串行流中发送一定数量的字符,因为程序只能从回显的arduino中读取一次。程序执行。我在开始时修复了?,它只是选择性地取出在UART缓冲区中等待的负值,这是一个负值。因为ascii值的范围从0到127,所以它们在技术上是签名的,我相信,这就是为什么我甚至能够得到负字符值。我通过添加一个查找负字符值的while循环来清理UART缓冲区,如果传入char的值为负,程序将从缓冲区中删除char。这是arduino方面的更新代码,问题出在哪里:

#include <StackArray.h>

boolean isSerial = false;
int num = 0;
StackArray<char> serialOut;
void setup() {
  pinMode(13, OUTPUT);
  Serial.begin(115200);
}

void cleanSerial(){
  char junk = Serial.peek();
  while(int(junk) < 0 || int(junk) > 127){
    Serial.read();
    junk = Serial.peek();
  }
}

void loop() {
  isSerial = false;
  while(Serial.available() > 0){
    cleanSerial();
    char byteRead = 0;
    isSerial = true;
    while(byteRead != 126){
      if(Serial.available() > 0){      
        byteRead = Serial.read();
        serialOut.push(byteRead);   
     }
    }
  } 
  if(isSerial){
     writeFromStack();
  }
  num++;
}
void blink(int times, int duration){
  for(int i = 0; i < times; i++){
    digitalWrite(13, HIGH);
    delay(duration);
    digitalWrite(13, LOW);
    delay(duration);
  }
}
void writeFromStack(){
  int arrayLen = serialOut.count();
  char tempBuf[arrayLen];
  for(int i = 0; i < arrayLen; i++){
    tempBuf[arrayLen - 1 - i] = serialOut.pop();
  }
  for(int i = 0; i < arrayLen; i++){
    Serial.print(tempBuf[i]);
  }
  Serial.print('\n');
}

谢谢大家。保持冷静和代码。