发串口的数据只执行了一次,啥问题!!
最近在学习arduino串口通讯,写了个实验程序,发现第一次执行是正确的,再发送指令结果依然是第一次的数值,各位大虾给看看,指点一下,谢谢了!/*
* 串口通讯实验
* 板子:stm32f103c8t6
* OLED SDA PB7,SAL PB6
* arduino IE 2.0
*/
#include <U8g2lib.h>
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* clock=*/ PB6, /* data=*/ PB7, /* reset=*/ U8X8_PIN_NONE);
//#define UID_base0x1FFFF7E8U //读取芯片ID
String comdata="";//字符串
void setup() {
Serial.begin(9600);//设置串口速率
while(Serial.read()>=0){} //清空串口缓存
u8g2.begin();//OLED屏初始化
u8g2.enableUTF8Print();
u8g2.setFont(u8g2_font_6x13_tf);//设置字体
u8g2.setFontDirection(0);//设置字号
u8g2.clearBuffer();//清屏
u8g2.drawFrame(0, 0, 128, 16);//画矩形框
u8g2.setCursor(25, 12);//指定显示位置
u8g2.print("STM32 Arduino!");//显示字符
u8g2.sendBuffer();//发送显示缓冲
delay(100);
}
void loop() {
if(Serial.available()>0){//检查串口是否有数据
comdata+=char(Serial.read());//将单个字符连接成字符串
delay(50);
int i=(comdata).toInt();//转化为数值
Serial.println(i);//向串口回传
switch(i){
case 1:
u8g2.setCursor(25, 32);//指定显示位置
u8g2.print("No:0001");//显示字符
break;
case 2:
u8g2.setCursor(25, 32);//指定显示位置
u8g2.print("No:0002");//显示字符
break;
case 3:
u8g2.setCursor(25, 12);//指定显示位置
u8g2.print("No:0003");//显示字符
break;}
}else{
u8g2.sendBuffer();
}
}
你没有清空字符串comdata
执行完一次后,加一个comdata=""; 果然如此,谢谢int_i,我看了半天没发现问题,真是当局者迷!:lol:lol 读出整个字符串用 Serial.readString()比较简洁,也不需要手动清空这个字符串, 因为该语句每次运行自动清空字符串变量。
页:
[1]