本帖最后由 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发送缓存状态位。
}
}
}
}
|