Arduino串口通信基础

char buffer[18];
void setup()
{
     Serial.begin(9600);
     Serial.flush();
}

void loop()
{
    
     if(Serial.available()>0)
     {
          int index=0;
           delay(100);//等待缓冲区充满
     //延时的目的是等待所有的数据发过来,这样做可以避免数据还没全部发过来之前就执行下一个语句。
          int numChar = Serial.available();
          if(nunChar>15)
          {
               index=15;
          }
          while(index--)
          {
               buffer[index++] = Serial.read();
          }
     }
}


Serial.begin(9600)告诉Arduino开始串口通信,括号内的数字是波特率,串口以这个波特率通信。
Serial.flush()命令清空串口中残存的字符。为输入/输出做准备。
Serial.available()判断接收缓冲器的状态函数。读取串口缓冲器的值(128节寄存器),以判断数据送达到串口。
Serial.read()读取串口函数,读取串口数据的第一个字节,如果没有返回-1,整数类型int。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于这种情况,你需要先定义好包头和包尾的格式,然后在接收到串口数据时,判断是否包含完整的数据包。具体操作可以参考以下步骤: 1. 定义包头和包尾的格式,例如包头为 "AA",包尾为 "BB"。 2. 声明一个字符数组,用于存储接收到的串口数据。 3. 使用 Arduino 的 Serial.available() 函数判断串口中是否有可用数据,如果有,就使用 Serial.read() 函数读取数据,并将其存储到字符数组中。 4. 在字符数组中查找包头和包尾,如果找到了完整的数据包,就可以提取出数据并进行处理。 具体代码实现可以参考以下示例: ```c++ #define HEADER "AA" // 定义包头为 "AA" #define FOOTER "BB" // 定义包尾为 "BB" char buffer[256]; // 声明一个字符数组,用于存储串口数据 int bufferIndex = 0; // 当前字符数组中的数据长度 void loop() { if (Serial.available() > 0) { // 如果串口中有可用数据 char ch = Serial.read(); // 读取数据 buffer[bufferIndex++] = ch; // 将数据存储到字符数组中 // 在字符数组中查找包头和包尾 int headerIndex = findHeader(buffer, bufferIndex); int footerIndex = findFooter(buffer, bufferIndex); // 如果找到了完整的数据包 if (headerIndex >= 0 && footerIndex >= 0 && footerIndex > headerIndex) { // 提取数据并进行处理 int dataLength = footerIndex - headerIndex - 2; // 数据包长度 char data[dataLength + 1]; // 声明一个字符数组,用于存储数据 memcpy(data, &buffer[headerIndex + 2], dataLength); // 复制数据到字符数组中 data[dataLength] = '\0'; // 添加字符串结束符 // 处理数据 processData(data); // 删除已处理的数据包 int remainingLength = bufferIndex - footerIndex - 2; memmove(buffer, &buffer[footerIndex + 2], remainingLength); bufferIndex = remainingLength; } } } // 在字符数组中查找包头,返回包头的索引,如果没有找到返回 -1 int findHeader(char *buffer, int length) { for (int i = 0; i < length - 1; i++) { if (buffer[i] == HEADER[0] && buffer[i+1] == HEADER[1]) { return i; } } return -1; } // 在字符数组中查找包尾,返回包尾的索引,如果没有找到返回 -1 int findFooter(char *buffer, int length) { for (int i = 0; i < length - 1; i++) { if (buffer[i] == FOOTER[0] && buffer[i+1] == FOOTER[1]) { return i+1; } } return -1; } // 处理数据 void processData(char *data) { // TODO: 处理数据的代码 } ``` 以上代码中,findHeader() 和 findFooter() 函数分别用于在字符数组中查找包头和包尾,并返回它们的索引。processData() 函数用于处理提取出来的数据。在 main() 函数中,首先使用 Serial.available() 函数判断串口中是否有可用数据,如果有,就从串口中读取数据并存储到字符数组中。然后使用 findHeader() 和 findFooter() 函数查找包头和包尾,如果找到了完整的数据包,就提取出数据并调用 processData() 函数进行处理。最后,使用 memmove() 函数删除已处理的数据包。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值