你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。
chrome
firefox
safari
ie8及以上
ST
意法半导体官网
STM32
中文官网
ST
全球论坛
登录/注册
首页
技术问答
话题
资源
创客秀
视频
标签
每日签到
STM32团队2
论坛吐槽优化专区
升级测试
UART如何接收不定长度的数据
[复制链接]
netlhx
提问时间:2015-1-8 08:58 /
问答
是否解决:
如果要接收不定长度的数据,诸位有什么好的建议,有参考代码最好,谢谢!
<
赞
0
收藏
2
评论
3
分享
发布时间:2015-1-8 08:58
举报
请先
登录
后回复
3个回答
AndyYau-268557
回答时间:2015-1-8 11:34:19
a0a.1 32b0c
那你的定义最大数组处理吧。和普通的一样,只是没法检验数据正确与否。
评分
参与人数
1
蝴蝶豆
+2
收起
理由
zero99
+ 2
查看全部评分
赞
0
评论
回复
支持
反对
Angel_YY
回答时间:2018-3-10 11:00:13
a0a.1 32b0c
不定长数据接收需要靠判定串口接收超时。比如连续20ms没有接收到数据判定数据接收完成。数据可以根据需要添加数据头和数据尾以及校验。建议代码如下
void TI_1MS_OnInterrupt(void)
{
//RS485接收命令超时判断,由于串口数据没有固定格式,这里采用时间分割,
//假设9600波特率,接收一字节用时约为1ms,如果连续10毫秒都没有新数据,说明本次交易命令接收完成
if(usTimeCntOf485<10){ //如果接收到了485串口数据
usTimeCntOf485++; //计时开始
}else if(usTimeCntOf485==10){//如果等待达到10毫秒
RS485Recv.ucStatFlg=1; //数据传送完成,交给主程序去轮训处理。
//AS_485_ClearRxBuf(); //清空缓冲
usTimeCntOf485=1001; //重置计时变量
}
}
复制代码
void AS_485_OnRxChar(void)
{
/* Write your code here ... */
AS_485_TComData ch;
usTimeCntOf485=0; //给接收计时变量清零
if(AS_485_RecvChar(&ch) == ERR_OK) //如果接收到串口字符
//AS_485_SendChar(ch);//发送回去,只在调试时使用
if(RS485Recv.ucStatFlg==0){ //如果当前数据缓冲允许接收
if(RS485Recv.ucDataLen<MSGBUFFERMAXLEN){ //如果接收到的数据不足32字节,继续接收,直到超时
RS485Recv.ucMsgBuffer[RS485Recv.ucDataLen]=ch; //把接收到的字符保存到结构体的缓冲区中。
RS485Recv.ucDataLen++; //更改接收到字符的长度变量,这里保存的是接收到了多少字节数据。
}else//如果一次性连续接收超过32字节,数据丢弃,防止缓冲区溢出。
{
RS485Recv.ucDataLen=MSGBUFFERMAXLEN+1; //标记字符长度为最大长度+1,通过这个值可以判断是否接收溢出了。
}
}else{ //如果当前数据缓冲不允许接收,例如主线程还没有处理完,此时只能丢弃
RS485Recv.ucStatFlg=2; //发生了丢弃
}
}
复制代码
评分
参与人数
1
蝴蝶豆
+4
收起
理由
zero99
+ 4
查看全部评分
赞
0
评论
回复
支持
反对
XinLiYF
回答时间:2018-3-10 11:53:23
a4a.1 32b0c
空闲总线中断,我封装的
串口驱动
评分
参与人数
1
蝴蝶豆
+2
收起
理由
zero99
+ 2
查看全部评分
赞
0
评论
回复
支持
反对
所属标签
相似问题
关于
意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号
手机版
快速回复
返回顶部
返回列表
评分
查看全部评分
评分
查看全部评分
评分
查看全部评分