与Arduino Uno进行十六进制串行通信,并通过串行监视器监视响应

时间:2019-07-04 17:58:52

标签: arduino hex uart uno

我有一个项目,我需要通过串行通信将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

但是我在每个“#”之后得到一个字符串“#”和一个方块。

原理图如下所示: Architecture diagram

1 个答案:

答案 0 :(得分:0)

让我们剖析您的问题:

  

我正在尝试通过串行通信将HEX线发送到设备,并回读响应...

您没有说什么设备,必须假设该设备既不是您稍后要讨论的Arduino,也不是计算机。

  

...正在监视交易。

除非您有多点串行链接(例如RS485),否则根本不可能做到这一点。如果要监视串行链接,则需要从任一侧进行监视,或者使用特殊的设备(硬件嗅探器)或使用几个附加的串行端口来实现自己的嗅探器。

  

...但是我没有通过USB读取正确的传输和任何响应。

如果您的Arduino是通过USB连接到计算机的,那么在一般情况下(虽然可能不是,但您不愿意解释),您已经为此目的使用了Arduino的硬件串行端口(串行监视器位于你的电脑)。

那么,“设备”连接到Arduino的位置在哪里?如果您是在将Arduino通过USB连接到计算机的同时将其连接到引脚0和1,那么我们发现了您的问题。

来自official documentation

  

在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,所以它不知道如何显示它们。如果使用能够显示十六进制的终端,则将正确显示命令。而且,当然还有尝试将两个以上的设备连接到总线的问题。