Arduino串口接收ASCII格式数值如何转换为INT类型
Arduino串口ASCII数值转整数实现方案
现象原因
你接收端拿到ASCII格式数据,是因为发送端调用的Serial.println()方法会自动将整数转换为对应ASCII字符串输出:比如采集到的数值是489,发送端实际输出的是'4'、'8'、'9'三个ASCII字符外加换行符\n,完全可以直接转换为int类型使用。
方案1:接收端直接解析ASCII(无需修改发送端代码)
直接在接收端拼接收到的ASCII字符,调用内置方法转整数即可,接收端示例代码如下:
const int ledPin = 13; // LED接13号引脚,也可自定义其他引脚 String recvBuffer = ""; // 存储接收到的ASCII字符串 int sensorValue = 0; void setup() { Serial.begin(9600); // 波特率必须和发送端完全一致 pinMode(ledPin, OUTPUT); recvBuffer.reserve(10); // 预分配存储空间,避免内存碎片化 } void loop() { // 持续读取串口数据 while (Serial.available() > 0) { char inChar = (char)Serial.read(); // 读到换行符代表单次数据发送完成 if (inChar == '\n') { sensorValue = recvBuffer.toInt(); // 直接调用String类方法转整数 // 自定义LED控制逻辑,示例为数值大于500亮灯,否则灭灯 digitalWrite(ledPin, sensorValue > 500 ? HIGH : LOW); recvBuffer = ""; // 清空缓存等待下一次数据 } else { recvBuffer += inChar; // 拼接收到的字符 } } }
注意要点
- 两端波特率、数据位、停止位参数必须完全匹配,否则会出现乱码导致转换失败
- 若传输距离较长、干扰大,可在发送端自定义简单校验规则,接收端校验通过后再使用数值
方案2:直接传输二进制整数(传输效率更高、稳定性更好)
如果不需要串口数据可读性,可直接传输二进制格式的整数,省去转换步骤,两端修改代码如下:
发送端修改后代码
int sensorValue = 0; const int input = A0; void setup () { Serial.begin(9600); sensorValue = analogRead(input); Serial.write(0xAA); // 自定义帧头,用于标识数据起始,避免接收错位 Serial.write((uint8_t*)&sensorValue, sizeof(sensorValue)); // 直接发送2字节整数的二进制数据 } void loop () { }
对应接收端代码
const int ledPin = 13; int sensorValue = 0; uint8_t recvBuf[2]; // 存储2字节的整数二进制数据 uint8_t bufIndex = 0; void setup() { Serial.begin(9600); pinMode(ledPin, OUTPUT); } void loop() { if (Serial.available() > 0) { uint8_t inByte = Serial.read(); // 读到帧头则重置缓存索引,准备接收新数据 if (inByte == 0xAA) { bufIndex = 0; } else { recvBuf[bufIndex++] = inByte; // 收满2字节则转换为int类型 if (bufIndex == 2) { memcpy(&sensorValue, recvBuf, 2); // LED控制逻辑 digitalWrite(ledPin, sensorValue > 500 ? HIGH : LOW); } } } }
内容的提问来源于stack exchange,提问作者Kim Fabian
相关产品推荐
相关产品推荐

