打印

PIC发送字符串时,发现终端只收到一半的数据??

[复制链接]
3846|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Light_David|  楼主 | 2010-11-13 02:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
问题是这样的,比如我定义了一个数组:const uchar  AT_command_ATE[] ={"ATBT"}; 或者const uchar  AT_command_CMGF[] ={"ABCD"};
我想通过串口发送这个字符串,但是现在的问题是终端只收到AB或者AC,第一个数组两个T没收到,第二个数组B和D没收到,发什么数据都这样,
不知道哪有出问题了??
发送函数是这样的:
void gprs_data(const uchar summ)
{  
    clr_wdt();
    TXREG = summ;
    while(!TXIF);
}
void gprs_string(const uchar *string)
{  
  clr_wdt();
  while(*string)
  {
    gprs_data(*string++);
  }
  gprs_data(0x0d);
}  


也就是隔一个收了一个,郁闷!
沙发
Light_David|  楼主 | 2010-11-13 02:04 | 只看该作者
好像不使用TXIF,而是用适当的延迟就没有问题了,那发送中断还有个P用啊???
delay占用我大量CPU时间,这不行啊,求救。

使用特权

评论回复
板凳
yewuyi| | 2010-11-13 13:04 | 只看该作者
重点检查:波特率、指针、发送缓冲这几个方面的代码。

PIC的UART我们都经常用的,MCU是不会有问题的,所以发送中断肯定可以正常工作的,你现在发送不对的原因肯定还是代码上面有问题。

另外,DELAY肯定不行,同时在各个函数中到处加 clr_wdt(); 显然也是错误的。

使用特权

评论回复
地板
Light_David|  楼主 | 2010-11-13 13:11 | 只看该作者
嗯,发现了,不好意思,网络上挖他人的程序贴过来的,不过自己确实也碰到这个问题才过来的,中断里喂狗是不对滴,这个会不会是串口调试助手的错,仿真结果是正确的

使用特权

评论回复
5
Light_David|  楼主 | 2010-11-13 13:30 | 只看该作者
/******Initial*****************/
void ini()
   {
        TRISC=0XC0;
        PORTC=0X00;
        SPBRG=17; //low spb 9600
        TXSTA=0X20;
        RCSTA=0X90;
        RCIE=1;
        PEIE=1;
        GIE=1;
   }

/***********************/
void sendmessage(const char *cp)
        {while(*cp)
                {TXREG=*cp++;
                 delay(3000);}//delay10mS
                 TXREG=0x0a;
                 delay(3000);
        }

/***********************/
void sendmessage(const char *cp)
        {while(*cp)
                {TXREG=*cp++;
                 while(TXIF);}
                 TXREG=0x0a;
                 delay(3000);
        }

叶版帮忙看看,876A/11.0592MHZ.
我现在都不用中断,直接查询TXIF都不行,上面那个发一个字节延迟10mS处理就没有问题,费解.

使用特权

评论回复
6
Light_David|  楼主 | 2010-11-13 15:33 | 只看该作者
阿门,怎么没人啊。问题还没解决啊。上面有处写误'等待标志是while(!TXIF);更正下。

使用特权

评论回复
7
Light_David|  楼主 | 2010-11-13 15:53 | 只看该作者
怎么没人帮忙啊。上面查询标志写误更正下应该是while(!txif)。

使用特权

评论回复
8
Light_David|  楼主 | 2010-11-13 18:26 | 只看该作者
问题已经解决了,还真在中断里做的,上面的查询TXIF标志就是不行,不知道是不是Bit间发送太快,串口助手响应不过来还是怎么地。

另外还有个菜菜的问题,要发送常数字符数组,和变量数组是不是必须使用两个函数?前面使用常数指针传递const char *cp, 后者使用变量字符指针char *pp传递..怎么来实现一种指针传递这两种类型呢??(不使用将常数字符数组复制到变量数组的方法)

使用特权

评论回复
9
杜专| | 2010-11-13 19:32 | 只看该作者
LZ 别把自己搞糊涂了  用数组很好解决问题,  写个通俗易懂的程序 好修改

使用特权

评论回复
10
shizaigaole| | 2010-11-13 20:39 | 只看该作者
"写TXREG
时,不立即清零TXIF 标志位。TXIF 在写指令后的第2
个指令周期清零。在写TXREG 后立即查询TXIF 会返回
无效结果。TXIF 为只读位,不能由软件置1 或清零。"

PIC16F87X手册已经很不好找了,
这是PIC16F88X手册关于TXIF的描述,楼主看看不是这个原因.
数据发送以后,加两个NOP延时看看

使用特权

评论回复
11
Light_David|  楼主 | 2010-11-14 01:34 | 只看该作者
:L都怪我我没仔细看Datasheet,还真是这个问题,哎一不小心就被PIC绕进去了。:lol

使用特权

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

本版积分规则

15

主题

273

帖子

2

粉丝