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