以 ARM 开发板 和 Arduino UNO 开发板通过串口通信为例,思考嵌入式设备之间通过串口通信的问题总结

通信双方

ARM 开发板为正点原子的阿尔法开发板,Arduino UNO开发板的单片机型号为:ATmega328P
在这里插入图片描述
这个单片机只有一个串口。

CH340 是电平转换芯片,RS232和RS485虽然是一种通信协议,但使用上也可以理解成是一种电平转换。

问题由来

为什么会总结一下这个开发板串口使用的问题。

我想通过 ARM开发板(没有电脑那种USB接口的串口,只有RS232接口和RS485接口形式的串口)的RXD和TXD通过RS232接口或者RS485接口与 Arduino 开发板相连接,但是 Arduino 开发板上是通过串口转(利用CH340G芯片)USB口。

ARM开发板端
在这里插入图片描述
在这里插入图片描述
RS485和RS232只能同时选择一个,用跳帽来决定。

Arduino开发板端
在这里插入图片描述
于是,我就想到下面这几种连接情况。

连接方案

但是,最终的本质是 ARM 端的 RXD 与 Arduino 端的TXD相连接,ARM 端的TXD与 Arduino 端的 RXD 相连接,这样才能完成通信。

第一种

ARM 端 – 使用 RS232(公) 转 USB(公) 线连接,Arduino 端 – 使用 USB (公)(开发板上有CH340芯片),双方之间通过 USB 母对母转换器连接。

思考结果:
在这里插入图片描述

第二种

双方都要有485芯片来完成收发,

ARM 端 – 使用 RS485, RS485出来的两条线(A线和B线),Arduino 端 – RXD和TXD引脚(要外接一个485模块),双方之间通过杜邦线连接,A线接A线,B线接B线。(貌似都不需要共地)

在这里插入图片描述
思考结果:
这种应该是最可靠的吧。

第三种

ARM 端 – 使用 RXD和TXD引脚,Arduino 端 – RXD和TXD引脚,双方之间通过杜邦线交叉连接。(共地是必须的)

思考结果:
猜想:长距离肯定不行,短距离应该可以吧,实际上行不行不知道,没实验过。

第四种

ARM 端 – 使用 RXD和TXD连接杜邦线转USB公头(下图),

在这里插入图片描述
Arduino 端 – 使用 USB公头(开发板上有CH340芯片),双方之间通过通过 USB 母对母转换器连接。

思考结果:
猜想:不行,因为此时ARM 端的USB公头其实就是RXD和TXD,而Arduino 端的USB公头则是D+和D-,之间没有电平转换(应该要有CH340类的电平转换芯片才能连接在一起后才行吧)。

第五种

ARM 端 – 使用 RXD和TXD连接杜邦线转USB公头(单片机程序下载器,有CH340),Arduino 端 – 使用 USB公头(开发板上有CH340芯片),双方之间通过通过 USB 母对母转换器连接。

思考结果:
猜想:这种也可以试一试,试一试才知道实际行不行。

遇到问题

因为上面的方案二中需要用到 Arduino 端 – 直接使用 RXD 和 TXD 引脚,所以我就想用 单片机下载器(有CH340)连接 Arduino 开发板上的 RXD 和 TXD 引脚之后通过USB头连接到电脑上,实验一下,结果就是没有达到期望的目的,现象如下:可以通过单片机向电脑发送数据,但不能通过电脑向单片机发送数据。于是,我就拔掉 USB 口,用 Arduino开发板上的 USB 公头插到电脑上来实验,结果是可以正常发送和接收的。

我就在想为什么会造成这种现象,造成这种现象的原因是什么呢?
在这里插入图片描述
猜想一:
会不会是当电脑向开发板发送信号后,由于板子上还连接了一个CH340部分的电路造成负载过大,信号能量太低,所以接收不到呢?

于是,我就专门接了一个5V电源来供电,结果仍然是不行的。

猜想二:
既然不是电源的问题,那就再看把CH340部分的电路给去掉试试看呢?那怎么去掉呢,我就把R9和R8这两个电阻给拆了下来。然后,再次实验,果然就好了。

那为什么会造成这种现象呢?与此同时,又有一个想法冒了出来,如果我把两个USB头(5V、GND、TXD、RXD都接)都接到电脑上会怎么样呢?

现象:两个都可以通过单片机向电脑发送数据,但都不能通过电脑向单片机发送数据。

那我把单片机下载器的那个电源(GND和VCC)给去掉呢?

现象:开发板上的那个 USB 可以完全实现收发,而单片机下载器的那个则只能通过单片机向电脑发送数据,但不能通过电脑向单片机发送数据。

结论:这种情况下,电路中同时只能有一个CH340存在,才能保证收发,具体什么原因可能要看CH340这个芯片手册吧,思考一下午了,不想深究了。要想使用开发板上的RXD和TXD引脚,就把R8和R9这两个芯片给去掉。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
下面是一个简单的示例代码,演示如何使用ESP8266开发板Arduino Uno之间串口通信。 ESP8266开发板代码: ```c++ #include <SoftwareSerial.h> // 设置ESP8266的串口通信引脚 SoftwareSerial espSerial(2, 3); void setup() { // 打开串口调试 Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } // 打开ESP8266串口通信 espSerial.begin(9600); // 等待ESP8266启动 delay(1000); // 向ESP8266发送AT指令 espSerial.println("AT"); delay(1000); // 检查是否收到“OK”响应 if (espSerial.find("OK")) { Serial.println("ESP8266 initialized."); } else { Serial.println("Error initializing ESP8266."); } } void loop() { // 读取来自Arduino的数据 if (Serial.available()) { String data = Serial.readStringUntil('\n'); Serial.print("Sending to ESP8266: "); Serial.println(data); // 发送数据到ESP8266 espSerial.println(data); } // 读取来自ESP8266的数据 if (espSerial.available()) { String data = espSerial.readStringUntil('\n'); Serial.print("Received from ESP8266: "); Serial.println(data); } } ``` Arduino Uno代码: ```c++ void setup() { // 打开串口调试 Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } } void loop() { // 读取来自ESP8266的数据 if (Serial.available()) { String data = Serial.readStringUntil('\n'); Serial.print("Received from ESP8266: "); Serial.println(data); // 发送数据到ESP8266 Serial.print("Sending to ESP8266: "); Serial.println(data); } } ``` 在这个示例中,我们使用SoftwareSerial库在ESP8266开发板上模拟一个串口通信引脚。在ESP8266的setup()函数中,我们初始化了两个串口通信引脚,分别用于与Arduino Uno和ESP8266之间的通信。我们发送了AT指令来检查ESP8266是否已经启动,并从Arduino Uno读取数据并将其发送到ESP8266,反之亦然。在Arduino Uno的loop()函数中,我们只是简单地读取来自ESP8266的数据并将其发送回去。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xuechanba

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值