打印

太菜了,心不甘,半夜发贴求救:关于串口通信(问题解决

[复制链接]
3335|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
geergeer|  楼主 | 2007-6-29 01:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
首先对浏览帖子的大侠表示衷心的感谢。小弟用16f877a与电脑串口实现通信,板子上用max487e实现ttl电平与485电平转换,然后通过一个485转232的转换器与电脑串口连接。对于max487e,其RE端与877a的RA0连接,其DE端与877a的RA1连接(当RE端为低且DE端为低,max487e输入有效,当DE端为高,max487e输出有效)。小弟用c语言编了一小段代码来检测通信,先是上位机给我传一个任意的数据,然后我回传10个数据上去。877a接收到的数据是正确的,发给电脑的数据显示出来是一大堆错乱的数据。代码如下:
void main (void)
{   
   TRISA=0x10;
   TRISC=0x98;
   PCFG3=0;
   PCFG2=1;
   PCFG1=1;
   PCFG0=0;//设置A口为I/O口
   RA0=0;//与max487e的RE连接
   RA1=0;//与max487e的DE连接
   GIE=1;
   PEIE=1;
   BRGH=1;//高速
   SPBRG=25;//波特率9600
   SYNC=0;//异步通信
   SPEN=1;//使能通信模块
   RCIE=1;
   RX9=1;//使能第九位
   ADDEN=1;//使能地址检测,因为要多机通信的,在这小段程序中没体现而已
   CREN=1;//使能接收模块
   TXIE=1;
   TX9=1; //传上去的数据也设为九位的
   TX9D=0;
   while(1);
}

void interrupt ISR(void)
{
   if(RCIE&&RCIF)
   {
      receive=RCREG;
      PORTD=leddata[receive]; //在数码管上显示收到的数据,这里能够正 
                              //确实现
      RA1=1; //使能max487e的发送
      TXREG=0x00;
      TXEN=1;//开始发送                     
   } 
   if(TXIE&&TXIF)//发送一个数据后又会自动的进入发送中断
   {
     PORTD=0x07;//在数码管上显示7这个数字,代表能顺利进入发送中断,这
                //里能实现
     cycle++;;// cycle初始化为0
     TXREG=cycle;
     if(cycle==10)
     TXEN=0;//关闭发送
   } 

}

恳请大侠们赐教
沙发
su_mj000| | 2007-6-29 07:03 | 只看该作者

用示波器看一下什么都明白了。

使用特权

评论回复
板凳
geergeer|  楼主 | 2007-6-29 07:57 | 只看该作者

多谢su_mj000

不知道代码部分有没有什么大缺陷?感觉程序跑的快的话,第一个数据0x00可能会丢,但是其他数据应该能按顺序收到啊

使用特权

评论回复
地板
兰天白云| | 2007-6-29 08:18 | 只看该作者

有一点要注意,PIC的发送与51的不一样

特别是再中断出理上,
还要注意485的半双工

使用特权

评论回复
5
geergeer|  楼主 | 2007-6-29 08:37 | 只看该作者

多谢斑竹

好象pic串口的一个特色就是TXIF和RCIF都是硬件清零的,软件无法改写其状态,然后487e的半双工,小弟理解是串口不能同时进行收发,必须按顺序执行

使用特权

评论回复
6
xieyuanbin| | 2007-6-29 12:11 | 只看该作者

理解有误

在PIC中档系列中,所有的中断标志位都必须由软件清零,所以TXIF和RCIF标志还是需要软件清零的.
不知道你上位机用什么软件接收?我想必须要选择十六进制显示才不会显示乱码.

使用特权

评论回复
7
geergeer|  楼主 | 2007-6-29 12:20 | 只看该作者

多谢斑竹xieyuanbin

看了一下877a的数据手册,RCIF需要用读RCREG的动作来清,TXIF需要用写TXREG的动作来清。上位机本来用vc编写了一个,可自发自收,但是和877a通信时收到的东西比较混乱,还出现错误报告,所以用了串口调试精灵,用16进制显示,显示的还是不可预知的数据,还报错I/0 ERROR!所以把程序帖上来,看是不是有什么大缺陷,如果不是,估计是硬件有问题

使用特权

评论回复
8
geergeer|  楼主 | 2007-6-30 00:07 | 只看该作者

还是没弄出来

错误很离谱,哦滴神啊~~~

使用特权

评论回复
9
xieyuanbin| | 2007-6-30 07:36 | 只看该作者

用示波器看发送0X55时的波形.

首先不要用485,用232的转换试试.
0X55发送时是一个方波,看看波形到底如何?方波的频率应为你所用波特率的1/2

使用特权

评论回复
10
geergeer|  楼主 | 2007-6-30 10:29 | 只看该作者

好的,下午去测

使用特权

评论回复
11
geergeer|  楼主 | 2007-7-2 18:16 | 只看该作者

主要还是想确认一下代码有没有大的错误

用示波器测了,能看到发送端有连续的方波,频率也对,但是发现877a接收端在程序不断往上发送0x55的时候有类似发送端的方波信号出现(已确认发送和接收端没短接),难道是因为板子没设计好,连续发送的数据串扰到接收端去了??而且发现连续向上位机发送数据的时候,led的显示也会受到干扰.将程序改成不使能接收,只使能发送,而且是不断的发送,上位机部分不能收到任何数据,好奇怪啊,所以还是想确认一下程序是不是没毛病?恳请大侠赐教~~~

使用特权

评论回复
12
xieyuanbin| | 2007-7-4 07:52 | 只看该作者

判断是硬件毛病.

接错了吧?上位机的波形如何?

使用特权

评论回复
13
chenlung| | 2007-7-4 10:53 | 只看该作者

re

初步怀疑,485通信上A,B两线可能没加上下拉电阻。

使用特权

评论回复
14
geergeer|  楼主 | 2007-7-4 22:52 | 只看该作者

多谢xieyuanbin和chenlung

我们也在怀疑硬件的问题,A,B线通过10k电阻接地和接5v电源上下拉,线路上没有接匹配电阻。昨天去卖板子的地方想买一块开发板来验证通信程序,发现自己的程序在开发板上面没实现功能,板子自带的demo也没实现通信功能,所以板子也不敢买回来了。然后去http://www.pic16.com/bbs/dispbbs.asp?boardid=33&id=22086看了别人发的一段很小的声称已经测试过的代码,上面提到说RC7和RC6都要设为输入,我很怀疑啊,不过还是把代码在自己板子上试了一下,好象也不行。不知道还有哪位大侠可以提供一段经过测试的串口通信代码,给小弟测试硬件之用~~~多谢了

使用特权

评论回复
15
geergeer|  楼主 | 2007-7-7 15:41 | 只看该作者

还是弄不出来,快失去耐性了

使用特权

评论回复
16
mcuatmel| | 2007-7-8 12:34 | 只看该作者

估计是你的485->232的转换头有问题

你最好用万能板飞一个RS232芯片,然后用其与电脑通讯,我想如果你的单片机没坏的话肯定能通。注意,开发时一般多备几片单片机,以排除问题。

使用特权

评论回复
17
geergeer|  楼主 | 2007-7-12 00:52 | 只看该作者

感谢xieyuanbin与mcuatmel

非常感谢!!两位对硬件的怀疑是正确的,把487e换成489芯片后,然后再将板子重新焊接过,芯片发送、接收端波形正确,于是可以确定软件上没有问题~~然后查485转232的转换头,确实有问题,更换后与上位机通信正确实现!感谢对帖子关注的所有大侠,期待下次的经验交流。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

54

帖子

0

粉丝