随笔 - 733  文章 - 2  评论 - 12  阅读 - 92万

串口接入检测与串口命令解析

一 串口接入检测的方法:

  如果单片机的串口RX引脚被设置成输入下拉IPD,当串口线接入时,因为与RX对接的是对方的TX(复用推挽),测试来读RX的话就为高电平,就可以更改模式,提醒单片机有串口接入!!!然后初始化串口将RX配置成浮动输入,就可以利用串口进行收发了。

二串口命令解析:以下命令解析的技巧:

  2.1 只需要设置帧头帧尾,中间部分的16进制就是结构体中的字符串(命令码的字符串提示)

       2.2解析:先解析帧头帧尾(有效数据才放入字符串),然后将接收的数据强制类型转换成字符串,与结构体数组中的定义的每条命令字符串进行匹配,匹配成功就输出对应的命令码。

 

if(au8Buf[u8Length - 2] == 0x0D && au8Buf[u8Length - 1] == 0x0A)
{
  const struct SCmd {
    const char *m_szCmd;
    uint8 m_u8Cmd;
  } asCmd[] = {
{"\r\nON\r\n",ZMCOMM_START}, //0D 0A 4F 4E 0D 0A /*命令1*/
{"\r\nOFF\r\n",ZMCOMM_STOP}, //0D 0A 4F 46 46 0D 0A/*命令2*/
{"\r\nMODE=1\r\n",ZMCOMM_SPEED}, //0D 0A 4D 4F 44 45 3D 31 0D 0A
{"\r\nMODE=0\r\n",ZMCOMM_HIGH}, //0D 0A 4D 4F 44 45 3D 30 0D 0A
{"\r\nO=1\r\n",ZMCOMM_SIGNAL_DEST}, //0D 0A 4F 3D 31 0D 0A
{"\r\nO=2\r\n",ZMCOMM_SIGNAL_SPEED}, //0D 0A 4F 3D 32 0D 0A
{"\r\nDEBUG0\r\n",ZMCOMM_DEBUG0}, //0D 0A 44 45 42 55 47 30 0D 0A
{"\r\nDEBUG1\r\n",ZMCOMM_DEBUG1}, //0D 0A 44 45 42 55 47 31 0D 0A
{"\r\nMODE=2\r\n",ZMCOMM_DEGREE}, //0D 0A 4d 4f 44 45 3d 32 0D 0A
};
  for(uint8 u8Index = 0; u8Index < sizeof(asCmd)/sizeof(asCmd[0]); u8Index++)
  {
    const struct SCmd *psCmd = &asCmd[u8Index];
    uint8 u8Length = strlen(psCmd->m_szCmd);
    if(strncmp((const char*)au8Buf,psCmd->m_szCmd,u8Length) == 0)
    {
      uint8 u8Cmd = psCmd->m_u8Cmd;
      this->m_pListener->bOnZMComm(u8Cmd);
      break;
    }
  }
}

posted on   杰瑞鼠  阅读(3343)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示