arrays - 如何将新行串行读取和打印存储或保存为字符串
问题描述
我有这段代码使用串行写入(UART通信)将十六进制发送到外部硬件:{0xbb, 0x00, 0x22, 0x00, 0x00, 0x22, 0x7e},然后串行硬件回复arduino,我使用串行打印。打印:BB 02 22 00 11 D0 34 14 00 00 00 00 00 00 00 24 12 14 11 62 77 69 EA 7E 它实际上是作为新行打印的问题/硬件一一发送十六进制代码 例如:BB 02 22 等。因为我使用 Serial.print,所以它打印为无行尾。如何从硬件回复接收和存储所有数据/十六进制代码,直到完成(直到 7E 或 0x7e)。然后将其打印为字符串。我尝试了一些缓冲区代码或串行事件,但它无法正常工作。感谢
#include <SoftwareSerial.h>
SoftwareSerial serial(D5,D6);
//#define DEBUG
unsigned char incomingByte;
void sendIdentifyCmd ()
{
serial.write (0xbb);
serial.write ((byte)0x00);
serial.write (0x22);
serial.write ((byte)0x00);
serial.write ((byte)0x00);
serial.write (0x22);
serial.write (0x7e);
#ifdef DEBUG
Serial.print (0xbb);
Serial.print (0x00);
Serial.print (0x22);
Serial.print (0x00);
Serial.print (0x00);
Serial.print (0x22);
Serial.print (0x7e);
Serial.println ();
#endif
}
void setup ()
{
Serial.begin (115200);
serial.begin (115200);
Serial.println ("begin initial Serial!\n");
}
void loop ()
{
sendIdentifyCmd ();
delay (2);
while(serial.available () > 0)
{
incomingByte=serial.read ();
if (incomingByte <= 0x0F) Serial.print("0");
Serial.print (incomingByte,HEX);
Serial.print (' ');
}
Serial.println ();
delay (1000);
}
我已经尝试过串行读取字节,直到像下面的代码一样,但它只是打印“abc:2abc:5”
void loop ()
{
sendIdentifyCmd ();
delay (2);
while(serial.available () > 0)
{
incomingByte=serial.read ();
if (incomingByte <= 0x0F) Serial.print("0");
Serial.print (incomingByte,HEX);
Serial.print (' ');
}
Serial.println();
delay(1000);
while(serial.available()>0)
{
abc=serial.readBytesUntil(0xFF, buffer, 24);
Serial.print("abc: ");
Serial.print(abc, HEX);
}
Serial.println ();
delay (1000);
}
解决方案
如果您知道外部硬件响应的长度(通常您应该知道),您可以使用.readBytes()
方法安全地读取所有串行缓冲区。
串行通信的一个好习惯是在定时器中断内发送消息并在主循环中接收响应。请参阅以下代码段:
#define BUFF_SIZE 24 // define buffer length
byte Buff[BUFF_SIZE]; // define buffer byte array
byte Message2Send[10]; // some message to send
void setup()
{
Serial.begin(9600);
SetupTimer1(); // define a function to setup timer1 registers and enable interrupts
}
void loop()
{
if (Serial.available () > 0)
{
Serial.readBytes(Buff, BUFF_SIZE);
}
}
// Timer1 Interrupt callback
ISR(TIMER1_COMPA_vect)
{
Serial.write(Message2Send, 10);
}
// Setting timer1 interrupt at 1Hz
void SetupTimer1()
{
cli(); //stop interrupts
// Timer Register setups
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
// set compare match register for 1Hz increments
OCR1A = 15624; // = (16*10^6) / (1*1024) - 1
TCCR1B |= (1 << WGM12);
TCCR1B |= (1 << CS12) | (1 << CS10);
TIMSK1 |= (1 << OCIE1A);
sei(); //allow interrupts
}
有关计时器的更多信息,请参阅此
推荐阅读
- python - 在 deepin (debian) 下安装 libxcb 1.13
- file - 如何访问 Gatsby 中“file”或“allFiles”GraphQL 查询返回的文件的文本内容?
- docker - 如何在 OPEN-SHIFT (docker-image) 上安装 JIRA-SERVER
- java - 用于选择给定符号之间除字符之外的所有内容的正则表达式
- angular - 无法使用下拉列表中的搜索过滤器显示具有初始值的 mat-select
- sql - 将所有列取消透视(或替代)成行
- javascript - 逐类导入还是整个模块导入,哪个最好?
- css - 小屏时在正文后显示浮动侧边栏
- python - Python 3.6.7 - OpenCV(4.1.2) 模板匹配
- fortran - 声明 CHARACTER 变量时出错:这是 gfortran 错误还是我自己的错误?