我正在设计一个串行通信平台,该平台从使用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之间交替对输出的文本没有区别。
答案 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');
}
谢谢大家。保持冷静和代码。