单片机串口数据接收时数据进行拼接

欢迎入群共同学习交流

一、代码展示

int recv_flag=0;
char recv_data[32];

//回调函数
int uart3_callback(void* param,const u8* data,u16 data_len)
{
    if (recv_flag == 0){
        memset(recv_data, 0, sizeof(recv_data));
        memcpy(recv_data, (char*)data, data_len);
        recv_flag = 1;
    }else    //上一次收到的数据不完整,则把数据追加到上一次的缓冲区尾部
        memcpy(recv_data + strlen(recv_data), data, data_len);
    return E_OK;
}

void parse_cmd()
{
    int len = strlen(recv_data);
    //未收到数据或收到的数据不完整
    if (recv_flag == 0 || recv_data[len - 2] != '\r' || recv_data[len - 1] != '\n') return;

    char *token = strtok(recv_data, "\r\n");
    char *p = NULL;
    while (token != NULL)
    {
        p = strstr((char*)token, "AT+");
        if(p!=NULL){
            if(strstr(p,"AT+PRESSURE=")){
                sscanf(p,"AT+PRESSURE=%d,OK\r\n",&target_max30102);
            }
        }
        token = strtok(NULL, "\r\n");
    }
    recv_flag = 0;
}

二、单片机串口号与端口对应图

串口对应图

  • 18
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在 Android 中,可以通过使用 `SerialPort` 类来进行串口通信,其中可以使用 `InputStream` 来读取串口数据。在读取串口数据,需要注意数据的拆包和拼接。 一般情况下,串口通信中的数据都是按照固定长度的数据进行传输的。因此,在读取串口数据,可以先读取数据包的包头,然后根据包头中的信息来确定数据包的长度,最后读取完整的数据包。 以下是一个简单的示例代码,演示了如何在 Android 中进行串口数据的拆包和拼接: ```java public class SerialPortActivity extends AppCompatActivity { private SerialPort mSerialPort; private InputStream mInputStream; private final int PACKET_HEADER = 0xAA; // 数据包包头 private int mPacketLength = 0; // 数据包长度 private byte[] mPacketData = new byte[1024]; // 数据数据 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_serial_port); try { // 打开串口 mSerialPort = new SerialPort(new File("/dev/ttyS1"), 115200, 0); mInputStream = mSerialPort.getInputStream(); } catch (IOException e) { e.printStackTrace(); } // 开启一个线程来读取串口数据 new Thread(new Runnable() { @Override public void run() { while (!Thread.currentThread().isInterrupted()) { try { // 读取一个字节的数据 int data = mInputStream.read(); // 判断是否为包头 if (data == PACKET_HEADER) { // 读取数据包长度 mPacketLength = mInputStream.read(); // 读取数据数据 for (int i = 0; i < mPacketLength; i++) { mPacketData[i] = (byte) mInputStream.read(); } // 拼接完整的数据包 byte[] packet = new byte[mPacketLength + 2]; packet[0] = (byte) PACKET_HEADER; packet[1] = (byte) mPacketLength; System.arraycopy(mPacketData, 0, packet, 2, mPacketLength); // 处理数据包 handlePacket(packet); } } catch (IOException e) { e.printStackTrace(); } } } }).start(); } private void handlePacket(byte[] packet) { // 在这里处理完整的数据包 // ... } @Override protected void onDestroy() { super.onDestroy(); // 关闭串口 if (mSerialPort != null) { mSerialPort.close(); } } } ``` 在上面的示例代码中,当读取到包头后,先读取数据包的长度,然后再读取数据包的数据。最后,使用 `System.arraycopy()` 方法将包头和数据拼接成一个完整的数据包,然后再将其传递给 `handlePacket()` 方法进行处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值