[生态工具] lkscope 串口通讯例子

[复制链接]
1207|1
 楼主| qdsang 发表于 2023-11-3 18:00 | 显示全部楼层 |阅读模式
本帖最后由 qdsang 于 2023-11-3 19:06 编辑

论坛没找到, 自己写了个,凑合着用


  1. u8 lkscope_read_index = 0;
  2. u8 lkscope_buff[100];
  3. #pragma pack(push) //保存对齐状态
  4. #pragma pack(1)//设定为1字节对齐
  5. typedef union
  6. {
  7.     u8 R[20];
  8.     struct
  9.     {
  10.         u8 p   ;
  11.         u8 index  ;
  12.         u8 len    ;
  13.         u8 crc    ;
  14.         u8 cmd    ;
  15.         u32 addr  ;
  16.         u8 addrlen;
  17.     } B;
  18.     struct
  19.     {
  20.         u8 p   ;
  21.         u8 index  ;
  22.         u8 len    ;
  23.         u8 crc    ;
  24.         u8 cmd    ;
  25.         u32 addr  ;
  26.         u8 val[4];
  27.     } W;
  28. } lkscope_t;
  29. #pragma pack(pop)//恢复对齐状态

  30. lkscope_t lkscope;

  31. u8 CalcCRC(u8 *pData, int len) {
  32. u8 crc = 0;
  33. u8 i;
  34. for (i = 0; i < len; i++) {
  35.     crc ^= pData[i];
  36. }
  37. return crc;
  38. }

  39. void lkscope_read(u8 c) {
  40.     u8 i;
  41.     if (lkscope_read_index == 0) {
  42.         if (c == 0x68) {
  43.             lkscope_read_index++;
  44.         }
  45.     } else {
  46.         lkscope_read_index++;
  47.     }

  48.     lkscope.R[lkscope_read_index - 1] = c;

  49.     if (lkscope_read_index > 2) {
  50.         if (lkscope_read_index >= (lkscope.R[2] + 4)) {
  51.             lkscope_read_index = 0;
  52.             lkscope_buff[0] = (0x68);
  53.             lkscope_buff[1] = (lkscope.B.index);
  54.             lkscope_buff[3] = (0);
  55.             lkscope_buff[4] = (lkscope.B.cmd);
  56.             
  57.             if (lkscope.B.cmd == 0x01) {
  58.                 for (i = 0; i < lkscope.B.addrlen; i++) {
  59.                     lkscope_buff[5 + i] = (*(u8*)(lkscope.B.addr + i));
  60.                 }
  61.                 lkscope_buff[2] = (lkscope.B.addrlen + 1);
  62.             } else if (lkscope.B.cmd == 0x02) {
  63.                 for (i = 0; i < lkscope.W.len - 5; i++) {
  64.                     (*(u8*)(lkscope.W.addr + i)) = lkscope.W.val[i];
  65.                 }
  66.                 lkscope_buff[2] = 2;
  67.                 lkscope_buff[5] = 1;
  68.             }
  69.             
  70.             lkscope_buff[3] = CalcCRC(lkscope_buff + 4, lkscope_buff[2]);

  71.             for (i = 0; i < lkscope_buff[2] + 4; i++) {
  72.                 /* 发送一个字节数据到串口 */
  73.                 UART_SendData(UART0, (uint8_t)lkscope_buff[i]);
  74.                 /* 发送缓存状态位 */
  75.                 while ((UART0->STT & BIT0) == FALSE)
  76.                     ; // UART0->STT发送缓存状态位。
  77.             }
  78.         }
  79.     }
  80. }
小小蚂蚁举千斤 发表于 2023-11-16 15:00 | 显示全部楼层
用一对传输线就能将数据以比特位进行传输的一种通讯方式
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

6

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部