6226|20

3

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

虚拟串口问题。 [复制链接]

    小弟目前做一个项目,要求设备具有双串口。但单片机用的是51系列,只有一个串口,因此需要虚拟一个串口。
在实现中,我用定时器0做为虚拟串口查询和发送。波特率设定为4800,因此在查询时,波特率为9600,因此程序运行时就需要特别频繁的进入定时器0中断查询程序中。
    同时由于还需要计时功能,因此系统中带有1302计时芯片,需要IIC总线通讯。但在读取和写入IIC总线数据时,需要关闭所有中断,以保证时序的完整。
    因此问题就出现了,在我读取1302时,需要关闭所有中断,因此虚拟串口就处于关闭状态。如果这个时候有数据过来的话,就会丢包。
    目前我所能做到的处理方法就是降低读取1302的频率,减少关闭中断的时间。同时在通讯协议中增加握手。但还是会有数据丢失。
不知道大家有没有什么好的解决方法。

最新回复

支持一下楼主,实现基本功能或许不难,只是出错处理比较麻烦,除非CPU速度很快。  详情 回复 发表于 2009-11-8 23:07
点赞 关注

回复
举报

1

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
用总线占用的概念

握手上后,就不读1302了,看你那样子也不一定是非要读1302

另外,实时时钟没必要次次都读它,

如果精度要求不是很高可以用片内定时器作为主时钟源

如果允许一天读一次1302较准一下就好

当然,这个要看你的片内定时器的平均误差,还有你的系统要求

 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
没办法,根据要求要与其它厂家的系统时间做匹配,所以必须要精确,用内部定时器做定时太不准确。而且1302还用了它的数据存储功能。所以什么时候读IIC总线时间是不定的。
 
 
 

回复

2

帖子

0

TA的资源

禁止访问

4
 
提示: 作者被禁止或删除 内容自动屏蔽
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

5
 
哥们有qq号么?以后可以方便交流。我看论坛里你的留言很多,而且质量很高。向你学习一下。呵呵。
我的13209460
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

6
 
我Q人满了

郁闷,呵呵

 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 5 楼 lbing7 的回复:
我Q人满了

郁闷,呵呵

太有闲了~

to楼主:如果不是频繁读写串口。就把一个串口复用成两个。
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(中级)

8
 
要是能复用,当然最好。
可是实际情况是这样的,虚拟串口每个要带4个设备。正常串口与PC服务器通讯。我们的中继器按照要求,不能超过30个节点。所以串口复用的话,成本会曾加太多,而且软件修改量也很大。
本来考虑过要用多串口转换芯片,但公司对产品成本压的太厉害,不让用。所以没办法,只能用这个方法了。
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(中级)

9
 
不过,目前我有个思路,说一下,大家帮忙想想,可不可以。

设置一个全局标志位。一旦进入过任何中断(时钟,外部,串口),就将该标志位置1.
在读取IIC总线前,先判断该标志位,只有为0时,才开始读取数据。在读取完毕后,再判断一次该标志位,如果为1,那么说明有可能在读取IIC的过程中被断过,造成数据错误,那么就重读。

不知道可行否,大家帮忙想想。
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

10
 
程序结构如下:
......
bit volatile interrupt_flag;
......

do
{
    interrupt_flag = 0;
    //Write_IICBus();
    Read_IICBus();//读或者写IIC

}while(!interrupt_flag)
......

基本结构就是这样。
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

11
 
应该可以试试。
不过还是不建议不断的读取1302的时钟。这样1302的芯片工作是否ok?最好还是用内部时钟做一下,过几秒再读取1302的值来校准一下。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

12
 
前些天提出的方法彻底失败。
我算了一下,1302读函数在程序中最小时间为0.3ms,而用作虚拟串口扫描的timer0在9600波特率情况下,中断时间为0.104ms,如果按照上面的方法,死机!郁闷

还要想想其他方法了。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

13
 
不知道你虚拟出来的串口可以降低一下波特率吗?
另外,IIC的数据传输是通过时钟的信号沿变化进行操作的,你只要在沿变化的时候保证中断是禁止的即可呀,这个时间是很短的,即便是这个禁止的时候进行有数据传输,串口1位数据的电平持续时间长度应该也比这个大很多吧,你再开启中断应该还能检测到吧...
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

14
 
楼主虚拟出来的串口是通过什么实现的?只是使用了一个定时器吗?
我之前也做过用io口模拟串口,不过我是用一个外部中断和一个定时器实现的,串口接收的时候,我用外部中断的下降沿捕捉起始信号,若捕捉到起始信号我开启定时器定时接收数据,发送的时候使用定时器产生串行帧数据,感觉效果还不错,基本上都能捕捉到每一个数据,不过有一个缺点,就是不能同时进行发送和接收,因为我只用了一个定时器,如果用两个定时器我想可以真正的做到全双工通信,一个用于收一个用发...
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

15
 
只用了一个定时器,没有用外部中断,因为两个中断全部用到别处了。
定时器平时不停的查询,一旦查到起始位就开始接收。

问题是现在其它中断用的太多了。1个外部中断,2个定时器中断,一个串口中断,还有IIC总线,单总线。
为了保证虚拟串口正常工作,在做其它工作时,还不能关虚拟串口的定时器中断。很头疼。

现在还处于初期设计阶段。正在设计方案。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

16
 
虚拟串口部分已经做完了。我用的一个定时器0,可以实现全双工,如果有兴趣,可以交流一下。
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(中级)

17
 
引用 14 楼 zhoushunda960 的回复:
...定时器平时不停的查询,一旦查到起始位就开始接收...

我觉得楼主这种定时器不停查询的方式不太可取,要是让定时器不停的查询的话,CPU也就干不了别的工作了...
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

18
 
引用 15 楼 zhoushunda960 的回复:
...我用的一个定时器0,可以实现全双工,如果有兴趣,可以交流一下...

斗胆和楼主探讨下,不知道楼主是用什么巧妙的方法实现的全双工,测试是否有丢失数据的现象?
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

19
 
引用 17 楼 shanzhao2009 的回复:
引用 15 楼 zhoushunda960 的回复:
...我用的一个定时器0,可以实现全双工,如果有兴趣,可以交流一下...

斗胆和楼主探讨下,不知道楼主是用什么巧妙的方法实现的全双工,测试是否有丢失数据的现象?


可以实现,如果cpu不做其它工作的时候,基本上可以保证数据不丢失。但波特率不能太高,2400到4800左右。

有qq么?一起探讨一下。
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(中级)

20
 
我的,13209460
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表