打印
[生态工具]

lkscope 串口通讯例子

[复制链接]
868|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qdsang|  楼主 | 2023-11-3 18:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 qdsang 于 2023-11-3 19:06 编辑

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


u8 lkscope_read_index = 0;
u8 lkscope_buff[100];
#pragma pack(push) //保存对齐状态
#pragma pack(1)//设定为1字节对齐
typedef union
{
    u8 R[20];
    struct
    {
        u8 p   ;
        u8 index  ;
        u8 len    ;
        u8 crc    ;
        u8 cmd    ;
        u32 addr  ;
        u8 addrlen;
    } B;
    struct
    {
        u8 p   ;
        u8 index  ;
        u8 len    ;
        u8 crc    ;
        u8 cmd    ;
        u32 addr  ;
        u8 val[4];
    } W;
} lkscope_t;
#pragma pack(pop)//恢复对齐状态

lkscope_t lkscope;

u8 CalcCRC(u8 *pData, int len) {
u8 crc = 0;
u8 i;
for (i = 0; i < len; i++) {
    crc ^= pData[i];
}
return crc;
}

void lkscope_read(u8 c) {
    u8 i;
    if (lkscope_read_index == 0) {
        if (c == 0x68) {
            lkscope_read_index++;
        }
    } else {
        lkscope_read_index++;
    }

    lkscope.R[lkscope_read_index - 1] = c;

    if (lkscope_read_index > 2) {
        if (lkscope_read_index >= (lkscope.R[2] + 4)) {
            lkscope_read_index = 0;
            lkscope_buff[0] = (0x68);
            lkscope_buff[1] = (lkscope.B.index);
            lkscope_buff[3] = (0);
            lkscope_buff[4] = (lkscope.B.cmd);
            
            if (lkscope.B.cmd == 0x01) {
                for (i = 0; i < lkscope.B.addrlen; i++) {
                    lkscope_buff[5 + i] = (*(u8*)(lkscope.B.addr + i));
                }
                lkscope_buff[2] = (lkscope.B.addrlen + 1);
            } else if (lkscope.B.cmd == 0x02) {
                for (i = 0; i < lkscope.W.len - 5; i++) {
                    (*(u8*)(lkscope.W.addr + i)) = lkscope.W.val[i];
                }
                lkscope_buff[2] = 2;
                lkscope_buff[5] = 1;
            }
            
            lkscope_buff[3] = CalcCRC(lkscope_buff + 4, lkscope_buff[2]);

            for (i = 0; i < lkscope_buff[2] + 4; i++) {
                /* 发送一个字节数据到串口 */
                UART_SendData(UART0, (uint8_t)lkscope_buff[i]);
                /* 发送缓存状态位 */
                while ((UART0->STT & BIT0) == FALSE)
                    ; // UART0->STT发送缓存状态位。
            }
        }
    }
}

使用特权

评论回复
沙发
小小蚂蚁举千斤| | 2023-11-16 15:00 | 只看该作者
用一对传输线就能将数据以比特位进行传输的一种通讯方式

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

6

帖子

0

粉丝