我有一个项目,我需要通过串行通信将Arduino Uno的十六进制字节数组发送到第三方设备,该设备执行一个动作,并在短时间后以十六进制形式回复字节数组时间(+ -500ms)。
第三方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 00 22 00 03 00 00 03 2B 01 E1 35
但是我在每个“#”之后得到一个字符串“#”和一个方块。
答案 0 :(得分:0)
让我们剖析您的问题:
我正在尝试通过串行通信将HEX线发送到设备,并回读响应...
您没有说什么设备,必须假设该设备既不是您稍后要讨论的Arduino,也不是计算机。
...正在监视交易。
除非您有多点串行链接(例如RS485),否则根本不可能做到这一点。如果要监视串行链接,则需要从任一侧进行监视,或者使用特殊的设备(硬件嗅探器)或使用几个附加的串行端口来实现自己的嗅探器。
...但是我没有通过USB读取正确的传输和任何响应。
如果您的Arduino是通过USB连接到计算机的,那么在一般情况下(虽然可能不是,但您不愿意解释),您已经为此目的使用了Arduino的硬件串行端口(串行监视器位于你的电脑)。
那么,“设备”连接到Arduino的位置在哪里?如果您是在将Arduino通过USB连接到计算机的同时将其连接到引脚0和1,那么我们发现了您的问题。
在Uno,Nano,Mini和Mega上,针脚0和1用于与计算机进行通信。 在这些引脚上连接任何东西都会干扰该通信,包括导致无法成功上传到板上。
最后,你说:
...尽管外部USART适配器确实显示正确的响应。
显然,这意味着您正在使用USB串行适配器将“设备”连接到计算机,而Arduino根本没有介入。我猜您的意思是您有一个终端程序,例如PuTTY或RealTerm for Windows或Linux上的Minicom,您打开了到虚拟串行端口的会话(在连接电缆时创建),键入命令并按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,所以它不知道如何显示它们。如果使用能够显示十六进制的终端,则将正确显示命令。而且,当然还有尝试将两个以上的设备连接到总线的问题。