第43节:通过串口用计数延时方式发送一串数据
时间:11-22
来源:互联网
点击:
- 息两个核心函数,以及一个
- * 统计消息总数的uiMessageCnt核心变量,通过此变量,我们可以知道消息队列里面是否有消息需要处理.
- * 我在做项目中很少用消息队列的,印象中我只在两个项目中用过消息队列这种方法。大部分的单片机
- * 项目其实直接用一两个中间变量就可以起到传递消息的作用,就能满足系统的要求。以下是各变量的含义:
- * #define const_Message_size10//环形消息队列的缓冲区数组大小
- * unsigned char ucMessageBuf[const_Message_size]; //环形消息队列的缓冲区数据
- * unsigned intuiMessageCurrent=0;//环形消息队列的取数据当前位置
- * unsigned intuiMessageInsert=0;//环形消息队列的插入新消息时候的位置
- * unsigned intuiMessageCnt=0;//统计环形消息队列的消息数量等于0时表示消息队列里没有消息
- */
- void insert_message(unsigned char ucMessageTemp)//插入新的消息到环形消息队列里
- {
- if(uiMessageCnt
- {
- ucMessageBuf[uiMessageInsert]=ucMessageTemp;
- uiMessageInsert++;//插入新消息时候的位置
- if(uiMessageInsert>=const_Message_size) //到了缓冲区末尾,则从缓冲区的开头重新开始。数组的首尾连接,看起来就像环形
- {
- uiMessageInsert=0;
- }
- uiMessageCnt++; //消息数量累加等于0时表示消息队列里没有消息
- }
- }
- unsigned char get_message(void)//从环形消息队列里提取消息
- {
- unsigned char ucMessageTemp=0;//返回的消息中间变量,默认为0
- if(uiMessageCnt>0)//只有消息数量大于0时才可以提取消息
- {
- ucMessageTemp=ucMessageBuf[uiMessageCurrent];
- uiMessageCurrent++;//环形消息队列的取数据当前位置
- if(uiMessageCurrent>=const_Message_size) //到了缓冲区末尾,则从缓冲区的开头重新开始。数组的首尾连接,看起来就像环形
- {
- uiMessageCurrent=0;
- }
- uiMessageCnt--; //每提取一次,消息数量就减一等于0时表示消息队列里没有消息
- }
- return ucMessageTemp;
- }
- void send_service(void)//利用累计主循环次数的计数延时方式来发送一串数据
- {
- switch(ucSendStep)//发送一串数据的运行步骤
- {
- case 0: //从环形消息队列里提取消息
- if(uiMessageCnt>0)//说明有消息需要处理
- {
- ucMessage=get_message();
- switch(ucMessage) //消息处理
- {
- case 1:
- ucSendregBuf[0]=0xeb; //把准备发送的数据放入发送缓冲区
- ucSendregBuf[1]=0x00;
- ucSendregBuf[2]=0x55;
- ucSendregBuf[3]=0x01; //01代表1号键
- ucSendregBuf[4]=0x00;
- ucSendregBuf[5]=0x00;
- ucSendregBuf[6]=0x00;
- ucSendregBuf[7]=0x00;
- ucSendregBuf[8]=0x41;
- uiSendCnt=0; //发送数据的中间变量清零
- uiSendTimeCnt=0; //累计主循环次数的计数延时器清零
- ucSendStep=1; //切换到下一步发送一串数据
- break;
- case 2:
- ucSendregBuf[0]=0xeb; //把准备发送的数据放入发送缓冲区
- ucSendregBuf[1]=0x00;
- ucSendregBuf[2]=0x55;
- ucSendregBuf[3]=0x02; //02代表2号键
- ucSendregBuf[4]=0x00;
- ucSendregBuf[5]=0x00;
- ucSendregBuf[6]=0x00;
- ucSendregBuf[7]=0x00;
- ucSendregBuf[8]=0x42;
- uiSendCnt=0; //发送数据的中间变量清零
- uiSendTimeCnt=0; //累计主循环次数的计数延时器清零
- ucSendStep=1; //切换到下一步发送一串数据
- break;
- case 3:
- ucSendregBuf[0]=0xeb; //把准备发送的数据放入发送缓冲区
- ucSendregBuf[1]=0x00;
- ucSendregBuf[2]=0x55;
- ucSendregBuf[3]=0x03; //03代表3号键
- ucSendregBuf[4]=0x00;
- ucSendregBuf[5]=0x00;
- ucSendregBuf[6]=0x00;
- ucSendregBuf[7]=0x00;
- ucSendregBuf[8]=0x43;
- uiSendCnt=0; //发送数据的中间变量清零
- uiSendTimeCnt=0; //累计主循环次数的计数延时器清零
- ucSendStep=1; //切换到下一步发送一串数据
- break;
- case 4:
- ucSendregBuf[0]=0xeb; //把准备发送的数据放入发送缓冲区
- ucSendregBuf[1]=0x00;
- ucSendregBuf[2]=0x55;
- ucSendregBuf[3]=0x04; //04代表4号键
- ucSendregBuf[4]=0x00;
- ucSendregBuf[5]=0x00;
- ucSendregBuf[6]=0x00;
- ucSendregBuf[7]=0x00;
- ucSendregBuf[8]=0x44;
- uiSendCnt=0; //发送
串口计数延时一串数 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)