我有一个项目,我需要通过串行通信从Arduino Uno向第三方设备发送一个十六进制字节数组,该设备执行一个操作,并以字节数组进行应答,在短时间内(+-500 in )也是十六进制。
第三方USART USB接口用于记录从第三方设备到计算机的响应,第三方设备TX和USART RX之间有蓝牙连接。Arduino TX和第三方设备RX是有线的。
现在,有问题的部分:
我的项目要求Arduino还捕获来自第三方设备的响应,处理响应,并根据值触发不同的输出(LED)。
我还需要调试Arduino的能力,以确保它接收到的十六进制值被正确处理,并相应地触发输出。
我目前拥有的代码(编译,但不像我预期的那样工作)如下所示:
byte one_shot_FAST[] = {0xAA, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x02, 0x23};
int IncomingByte = 0;
uint8_t q1 = 0;
uint8_t q2 = 0;
uint16_t qtot = 0;
int qVal = 0;
int qValMax = 65535;
const int triggerPin = 2;
int triggerState = LOW;
void setup() {
Serial.begin(19200);
pinMode(triggerPin, INPUT);
Serial.println("<Arduino is ready>");
}
void loop() {
triggerState = digitalRead(triggerPin);
if (triggerState == HIGH){
Serial.write(&one_shot_FAST[0], sizeof(one_shot_FAST));
//while(!Serial.available());
IncomingByte = Serial.read();
for (int i=0; i<13; i++) {
while(!Serial.available()); //wait for character
IncomingByte = Serial.read();
Serial.println(IncomingByte,HEX);
delay(10);
}我希望得到以下响应: AA 00 22 00 00 03 00 00 03 2B 01 E1 35
但是在每个"#“之后,我会得到一个"#”的字符串和一个方形块。
这就是原理图的样子:

发布于 2019-07-05 06:40:03
让我们仔细分析一下你的问题:
我正试图通过串行通讯把一条HEX线路发送到一个设备上,然后把响应读回来.
你不知道是什么设备,你必须假设该设备既不是你以后谈论的阿杜诺,也不是计算机。
...while监视事务。
除非您有一个多点的串行链接(例如RS485),否则这是不可能的。如果您想监视一个串行链接,您需要从任何一方进行监视,或者使用一个特殊的设备(硬件嗅探器),或者使用几个额外的串行端口实现您自己的嗅探器。
..。但我没有读取正确的传输和任何反应通过USB。
如果您的Arduino通过USB连接到您的计算机,那么在一般情况下(您可能不是,但您不想解释),您已经在使用Arduino的硬件串行端口(计算机上的串行监视器)。
那么,“设备”在哪里连接到你的Arduino?如果您的意思是,您已经连接到引脚0和1,而您保持Arduino连接到您的计算机通过USB,那么我们已经发现了您的问题。
来自正式文件
在Uno、Nano、Mini和Mega上,引脚0和1用于与计算机通信。连接到这些引脚上的任何东西都会干扰的通信,包括导致上传失败。
最后,你说:
...although是一个外部USART适配器,它确实显示了正确的响应。
很明显,你的意思是你使用USB到串行适配器将你的“设备”连接到计算机上,而Arduino根本没有介入。我猜您的意思是您有一个终端程序,如PuTTY或RealTerm for Windows或Linux,您打开一个会话到虚拟串行端口(当连接电缆时创建),输入命令并按intro键。如果是这样,请注意,您用Arduino编写的命令不会以CR或LF结尾。您的设备需要线路终止吗?人们只能猜测..。
现在用你的密码。不知道你想做什么,或者猜测填补了很多空白,给你很多反馈是不容易的。
但这句话似乎特别神秘:
Serial.write(&one_shot_FAST[0], sizeof(one_shot_FAST));由于one_shot_FAST是一个字节数组(为了所有目的都是一个指针),所以当您使用&one_shot_FAST[0]时,您要求写入该数组的第一个元素在内存中占据的地址。我不知道您对此有什么想法,但我认为您可能希望删除&,将实际的字节发送到命令中。
在您的代码中还有其他一些奇怪的事情:您写入端口并立即读取一个字节(很可能在数据离开TX缓冲区之前)。我想这会导致Serial.read()还给-1。
编辑:我已经测试了您的代码,并且编写部分(显然我没有硬件来回答命令)工作得很好。您看到的正方形和破折号很可能是因为您使用的是Arduino系列控制台,它试图将大于127的HEX值显示为ASCII,因此它不知道如何显示它们。如果使用能够显示HEX的终端,则会正确显示命令。当然,你也有一个问题,就是要把两个以上的设备连接到总线上。
https://stackoverflow.com/questions/56892596
复制相似问题