【发布时间】:2011-12-03 20:51:49
【问题描述】:
我无法让我的 Arduino 微控制器读取 RS-232 信号。我的项目要求我读取空气质量监测器输出的数据。
我的组件:
为了测试串行通信是否正常工作,我在 Arduino 网站上找到了一些示例代码。这是我正在运行的确切代码:
//Created August 23 2006
//Heather Dewey-Hagborg
//http://www.arduino.cc
#include <ctype.h>
#define bit9600Delay 84
#define halfBit9600Delay 42
#define bit4800Delay 188
#define halfBit4800Delay 94
byte rx = 0;
byte tx = 1;
byte SWval;
void setup() {
pinMode(rx,INPUT);
pinMode(tx,OUTPUT);
digitalWrite(tx,HIGH);
digitalWrite(13,HIGH); //turn on debugging LED
SWprint('h'); //debugging hello
SWprint('i');
SWprint(10); //carriage return
}
void SWprint(int data)
{
byte mask;
//startbit
digitalWrite(tx,LOW);
delayMicroseconds(bit9600Delay);
for (mask = 0x01; mask>0; mask <<= 1) {
if (data & mask){ // choose bit
digitalWrite(tx,HIGH); // send 1
}
else{
digitalWrite(tx,LOW); // send 0
}
delayMicroseconds(bit9600Delay);
}
//stop bit
digitalWrite(tx, HIGH);
delayMicroseconds(bit9600Delay);
}
int SWread()
{
byte val = 0;
while (digitalRead(rx));
//wait for start bit
if (digitalRead(rx) == LOW) {
delayMicroseconds(halfBit9600Delay);
for (int offset = 0; offset < 8; offset++) {
delayMicroseconds(bit9600Delay);
val |= digitalRead(rx) << offset;
}
//wait for stop bit + extra
delayMicroseconds(bit9600Delay);
delayMicroseconds(bit9600Delay);
return val;
}
}
void loop()
{
SWval = SWread();
SWprint(toupper(SWval));
}
我将 RX 和 TX 引脚分别更改为 0 和 1,因为这些是 Cutedigi RS-232 芯片使用的引脚。现在,当我打开终端窗口并输入字符时,会出现乱码和字母(例如:¾_ò_òòËÌßÌËßÌÊÌòyofyofsæóÙöÇ æü æ)。
根据示例代码网站,如果我输入abcdefg,终端窗口应该显示ABCDEFG。
为什么会这样?我已将波特率设置为 9600,如 sketch 中所指定,但我仍然遇到问题。重置 Arduino 似乎也无济于事 - 我仍然收到乱码。
【问题讨论】:
-
虽然这个问题肯定有一些软件开发角度,但它可能更适合 [electronics.stackexchange.com/]
-
好的,谢谢,然后删除这篇文章。我会查看electronics.stackexchange.com
-
如果出现乱码,通常表示波特率不匹配。
-
要么,要么 startbit 上的同步是由噪声触发的。在半位暂停后,我会添加一个去抖动循环,或者对“if (digitalRead(rx) == LOW)”进行一次小的重新测试。
标签: serial-port arduino