这个是代码
airsensor.zip
(27.44 MB, 下载次数: 67)
首先是我需要通过串口接收传感器的数据的格式
本来计划是串口6来接收的,但是串口6没配置好,就先用串口1做这个了,稍后再移植,然后我自己写了个sensor程序来作为这个传感器的驱动程序,经过测试,第一帧数据是可以正常接收的
我再清除窗口再向板子发数据 回复我3次,我再向单片机发送数据 这就是我疑惑的地方,不知道为什么会出现这个错误 下面是sensor程序 #include "airsensor.h" #include "bsp.h" #include "string.h"
uint8_t ucAS_Len=19; uint8_t ucAS_Head = 0; uint8_t ucAS_Buf[512]; uint16_t usAS_Pos = 0; const char buf5[] = "传感器异常,未收到数据\r\n"; const char buf6[] = "传感器正常,开始接收数据\r\n"; const char buf7[] = "传感器正常,结束完一帧数据\r\n"; void AirSonsor_getdata(void) { uint8_t ucData;
while(1) { if (comGetChar(COM1, &ucData)) { bsp_LedToggle(2); //LED2标记接收到了数据 comSendBuf(COM1, (uint8_t *)buf6, strlen(buf6)); if(ucAS_Head ==0) { if(ucData==1) { ucAS_Buf[usAS_Pos]=ucData; usAS_Pos++;//1 comGetChar(COM1, &ucData); if(ucData==3) { ucAS_Buf[usAS_Pos]=ucData; usAS_Pos++;//2 comGetChar(COM1, &ucData); if(ucData==0x0c) { ucAS_Buf[usAS_Pos]=ucData; usAS_Pos++;//3 comGetChar(COM1, &ucData); } } } }
for(int i=usAS_Pos;i<ucAS_Len;i++)//3 { ucAS_Buf[usAS_Pos] = ucData; usAS_Pos++; comGetChar(COM1, &ucData); } bsp_LedToggle(3); comSendBuf(COM1, (uint8_t *)buf7, strlen(buf7)); break; } else { comSendBuf(COM1, (uint8_t *)buf5, strlen(buf5)); bsp_LedToggle(4);//led4表示接收失败 break; } } }
然后是主函数: #include "bsp.h" /* 底层硬件驱动 */ #include "airsensor.h" #include "string.h"
/* 定义例程名和例程发布日期 */ #define EXAMPLE_NAME "V7-串口和PC机通信(驱动支持8个串口FIFO)" #define EXAMPLE_DATE "2018-12-12" #define DEMO_VER "1.0"
static void PrintfLogo(void); static void PrintfHelp(void); extern uint8_t RX_count; /* ********************************************************************************************************* * 函 数 名: main * 功能说明: c程序入口 * 形 参: 无 * 返 回 值: 错误代码(无需处理) ********************************************************************************************************* */ int main(void) { uint8_t ucKeyCode; uint8_t read; uint8_t flag=0; const char buf1[] = "接收到串口命令1\r\n"; const char buf2[] = "接收到串口命令2\r\n"; const char buf3[] = "接收到串口命令3\r\n"; const char buf4[] = "接收到串口命令4\r\n"; bsp_Init(); /* 硬件初始化 */ PrintfLogo(); /* 打印例程名称和版本等信息 */ PrintfHelp(); /* 打印操作提示 */
bsp_StartAutoTimer(0, 100); /* 启动1个100ms的自动重装的定时器 */ //bsp_StartAutoTimer(1, 100); /* 主程序大循环 */ while (1) { /* CPU空闲时执行的函数,在 bsp.c */ bsp_Idle(); /* 判断定时器超时时间 */ if (bsp_CheckTimer(0)) { /* 每隔100ms 进来一次 */ /* 翻转LED1的状态 */ bsp_LedToggle(1); } if (RX_count==20) { /* 每隔100ms 进来一次 */ /* 翻转LED2的状态 */ flag=1; RX_count=0; } if(flag==1) { flag=0; AirSonsor_getdata(); } /* 处理按键事件 */ ucKeyCode = bsp_GetKey(); if (ucKeyCode > 0) { /* 有键按下 */ switch (ucKeyCode) { case KEY_DOWN_K1: /* 按键K1键按下 */ printf("按键K1按下\r\n"); bsp_LedToggle(1); break; case KEY_DOWN_K2: /* 按键K2键按下 */ printf("按键K2按下\r\n"); bsp_LedToggle(3); break;
case KEY_DOWN_K3: /* 按键K3键按下 */ printf("按键K3按下\r\n"); bsp_LedToggle(4); break; default: break; } } } }
/* ********************************************************************************************************* * 函 数 名: PrintfHelp * 功能说明: 打印操作提示 * 形 参:无 * 返 回 值: 无 ********************************************************************************************************* */ static void PrintfHelp(void) { printf("操作提示:\r\n"); printf("1. 启动一个自动重装软件定时器,每100ms翻转一次LED2\r\n"); printf("2. 串口接收到字符命令'1',返回串口消息接收到串口命令1\r\n"); printf("3. 串口接收到字符命令'2',返回串口消息接收到串口命令2\r\n"); printf("4. 串口接收到字符命令'3',返回串口消息接收到串口命令3\r\n"); printf("5. 串口接收到字符命令'4',返回串口消息接收到串口命令4\r\n"); printf("6. K1按键按下,串口打印按键K1按下\r\n"); printf("7. K2按键按下,串口打印按键K2按下\r\n"); printf("8. K3按键按下,串口打印按键K3按下\r\n"); }
我在bsp_uart_fifo.c中定义了一个全局变量uint8_t RX_count=0;,让这个RX_count=_pUart->usRxCount; 然后我在主函数里引用他,做为我判断fifo里有1帧数据,我在airsensor函数里去处理。 请问这样做是不是不对,该怎么解决?请各位大佬们帮助,我会把程序放上去,求求帮助 然后我留下我的QQ,有时间的大佬可以随时联系我:1151144104
|