如何用循环队列来串口通信中的读写缓存呢? 如何用循环队列来串口通信中的读写缓存呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 /*******************************************************************函数名称: S32 WriteComm(S32 comport, U8 *buf, S32 len);函数功能: 将串口收到的数推入串口缓冲区入口参数: comport 串口号 只开放串口0 buf 写串口的数 len 数据的长度返 回 值: = 1 写成功(写成功字节个数) = 0 写失败备 注: ********************************************************************/u16 WriteComm (u8 comport, char *buf, u16 len){ u16 i; //if(comport == 2) return 1; if(!OpenComm(comport)) return 0; if (len == 0) return 0; if(comport == 0) { for(i=0;i<len;i++) { txd_buf[txd_end++] = *buf; if(txd_end>=SIO_TXD_TOTALLEN) //接收队列拐弯 { txd_end = 0; } buf++; } sio_send_parse(); } else { return 0; } return 1;}void sio_send_parse(void){ while(txd_head != txd_end) { U0THR = txd_buf[txd_head++]; if(txd_head>=SIO_TXD_TOTALLEN) { txd_head = 0; } while( (U0LSR&0x40)==0 ); } }/*******************************************************************函数名称: u16 ReadComm (u8 comport, char *buf, u16 len)函数功能: 读串口入口参数: comport 串口号 只开放串口0 buf 需要推入串口缓冲区中的数据 len 需读取数据最大长度 -般取IOLEN返 回 值: =0 读失败 >0 读到的有效报文长度备 注: API函数, ********************************************************************/u16 ReadComm (u8 comport, char *buf, u16 len){ u16 n = 0, i; //U8 j; if(!OpenComm(comport)) return 0; if(len == 0) return 0; if(comport == 0) { i = 0; while(rec_head != rec_end) { *buf = rec_buf[rec_head++]; if(rec_head>=SIO_REC_TOTALLEN) rec_head = 0; /* //test *buf = rec_buf[rec_head]; U0THR = rec_buf[rec_head]; if(rec_head>=SIO_REC_TOTALLEN) //接收队列拐弯 { rec_head = 0; } while( (U0LSR&0x40)==0 ); // 等待数据发送完毕 rec_head++; if(rec_head>=SIO_REC_TOTALLEN) rec_head = 0; */ buf ++; i ++; if(i >= len) { break; } } n = i; if (n > 0) { return n; } return 0; } else { return 0; } } zencart中 function get_template_dir 求解释 关于 NoSoap 调用非80端口的webservice的问题 帝国cms 如何实现多语言共存 PHP生成JS问题 注册页面Ajax检查用户名重复 php中文编码问题? 个性定制产品插件 PHP上传图片到服务器上,并把它的路径存储在数据库的一个字段里 Ueditor使用问题 08cms房产系统安装完以后页面空白 如何实现用户注册必须是汉字注册 那位大哥给一个phpchina的申请码啊
函数名称: S32 WriteComm(S32 comport, U8 *buf, S32 len);
函数功能: 将串口收到的数推入串口缓冲区
入口参数: comport 串口号 只开放串口0
buf 写串口的数
len 数据的长度
返 回 值: = 1 写成功(写成功字节个数)
= 0 写失败
备 注:
********************************************************************/
u16 WriteComm (u8 comport, char *buf, u16 len)
{
u16 i;
//if(comport == 2) return 1;
if(!OpenComm(comport)) return 0;
if (len == 0) return 0;
if(comport == 0)
{
for(i=0;i<len;i++)
{
txd_buf[txd_end++] = *buf;
if(txd_end>=SIO_TXD_TOTALLEN) //接收队列拐弯
{
txd_end = 0;
}
buf++;
}
sio_send_parse();
}
else
{
return 0;
}
return 1;
}void sio_send_parse(void)
{ while(txd_head != txd_end)
{
U0THR = txd_buf[txd_head++];
if(txd_head>=SIO_TXD_TOTALLEN)
{
txd_head = 0;
}
while( (U0LSR&0x40)==0 );
}
}/*******************************************************************
函数名称: u16 ReadComm (u8 comport, char *buf, u16 len)
函数功能: 读串口
入口参数: comport 串口号 只开放串口0
buf 需要推入串口缓冲区中的数据
len 需读取数据最大长度 -般取IOLEN
返 回 值: =0 读失败
>0 读到的有效报文长度
备 注: API函数,
********************************************************************/
u16 ReadComm (u8 comport, char *buf, u16 len)
{
u16 n = 0, i;
//U8 j;
if(!OpenComm(comport)) return 0;
if(len == 0) return 0;
if(comport == 0)
{
i = 0;
while(rec_head != rec_end)
{
*buf = rec_buf[rec_head++];
if(rec_head>=SIO_REC_TOTALLEN) rec_head = 0;
/* //test
*buf = rec_buf[rec_head];
U0THR = rec_buf[rec_head];
if(rec_head>=SIO_REC_TOTALLEN) //接收队列拐弯
{
rec_head = 0;
}
while( (U0LSR&0x40)==0 ); // 等待数据发送完毕
rec_head++;
if(rec_head>=SIO_REC_TOTALLEN) rec_head = 0;
*/
buf ++;
i ++;
if(i >= len)
{
break;
}
}
n = i;
if (n > 0)
{
return n;
}
return 0;
}
else
{
return 0;
}
}