参考NEMA0183协议就可以,以'$'字符为一帧开头,'\r'或‘\n’为结尾 那就参考modbus吧,用定时器判断数据接收结束 本帖最后由 proteldxp 于 2013-9-17 22:27 编辑
约定一个数据格式:帧起始位+数据长度+数据包+结束位,必要时可以加上校验位。 liujie14565 发表于 2013-9-17 22:51 static/image/common/back.gif
亲 假如 数据包 没有 定义 帧尾 的 状态下 可以怎么判断接收完毕
超时20MS,, 1.STM32有个串口空闲中断,能检测是否连续发过来。
2,硬件定时器,空闲3个包就是超时。
3.软件计算,数据最后需要有结束符号,或者固定协议,modbus等。
没想到了。。。 状态机
http://wuqidongxing.blog.163.com/blog/static/18434950200791910512879/ 應該不太難,接收後一定時間內,沒數據回來就是完了 但是要我寫好,可能也要數天呢 没有帧尾就加上帧尾,加不上就加帧头,帧头报告长度,收满长度收工。 定时器就那么紧缺?感觉用定时器挺好的啊。 vtte 发表于 2013-9-18 09:37 static/image/common/back.gif
没有帧尾就加上帧尾,加不上就加帧头,帧头报告长度,收满长度收工。
+10086 vtte 发表于 2013-9-18 09:37 static/image/common/back.gif
没有帧尾就加上帧尾,加不上就加帧头,帧头报告长度,收满长度收工。
用dwin的gdus就是這樣了{:smile:} 没有帧头帧尾,又没有长度信息,那除了字符间隔还能有啥办法 如果对发送方无法做限制:
用一个定时器做接收超时, 这种效果最好.
如果定时器实在挪不出来. 在无线循环与接收中断中使用状态机机制. {:smile:}{:smile:}{:smile:}{:smile:}{:smile:} unsigned int i;
void main(void)
{
.........
i = 0;
while(1)
{
if(i)
{
i++;
if(i > (根据循环工作量取得一个常量经验值))
{
// 认为接收到一帧, 对接收到的数据帧进行处理;
// 未防止接收数据丢失, 开启两个接收缓冲区, 关中断, 处理数据前切换接收缓冲区,将 i 赋值为0等安全操作..... 重新开中断.
}
}
}
}
void uartisr(void) interrupt 4
{
if(RI)
{
RI = 0;
// 将接收到的数据放入缓冲
........
i = 1;
}
} liujie14565 发表于 2013-9-17 22:51 static/image/common/back.gif
亲 假如 数据包 没有 定义 帧尾 的 状态下 可以怎么判断接收完毕
有数据长度啊,判断长度到了就说明接收完了。 没有帧头,帧尾又没有数据长度,你的这套通信协议是有多随便啊, 怎么保证数据的准确性嘞。 串口如果没有明确的帧定义,那就悲剧了 定这个协议的人脑袋可能有问题,他是定来让人看的,不是让计算机解析的
要不,你发些接收到的数据来,咱们帮你分析分析 liujie14565 发表于 2013-9-23 15:33 static/image/common/back.gif
就是 GSM 模块 返回 的 信息,不同的 操作 返回的数据 长度 不一致
你是说用PDU通讯吗?
如果是,你查查PDU解析吧 liujie14565 发表于 2013-9-23 15:33 static/image/common/back.gif
就是 GSM 模块 返回 的 信息,不同的 操作 返回的数据 长度 不一致
GSM?
你即然是串口,想必指的是AT指令吧?
所有AT指令都是以 \r\n 结尾的
怎么没有结束符呢、? windboy 发表于 2013-9-23 16:31 static/image/common/back.gif
GSM?
你即然是串口,想必指的是AT指令吧?
所有AT指令都是以 \r\n 结尾的
+86 10086正解 超时为啥要单独站个硬件定时器软件可以做啊。 额,定时器可以吧
页:
[1]