写在梦想边上 https://passport2.21ic.com/?583043 [收藏] [复制] [RSS]

日志

关于PIC16F877A串口发送任意字符串的问题

已有 1394 次阅读2010-4-16 02:58 |系统分类:单片机| 16F877A, 串口, 字符串

以前在使用51系列的单片机的时候,下面两个函数使用起来完全没有问题,一个是发送单个字符的,一个是发送任意长度字符串的。


//向串口发送一个字符


void send_char_com( uint8 ch)


{


       TXREG = ch;


       while (!TRMT);


       TRMT = 0 ;   //必须写,不然有可能产生错误数据发送


}


//向串口发送一个字符串


void send_string_com(uchar *str)


{


       uint16 k= 0 ;


       do


       {


              send_char_com(*(str + k));


              k++;


       }


       while (*(str + k)!='\0');


}


       现在移植到PIC上面来以后,却发现send_string_com()函数不可以用了,通过串口调试助手发现发送过来的数据为乱码。在试了很多次以后,确实发现PIC16F877A不支持这种写法,由于PIC16F877A对于指针的支持不是很好,所以这种对指针的操作方式应用起来不行。但是要是碰到很多字符串需要发送,难道只能一个个慢慢复制过来发送吗?在找了很多资料无果的情况下,突然发现一个程序,但是还是有一个缺点。


#include <stdio.h>


printf("\rPress a key and I will echo it back:\n");


void putch(unsigned char byte)


{


       /* output one byte */


       while(!TXIF)  /* set when register is empty */


              continue;


       TXREG = byte;


}


通过增加这个库和这个函数就可以打印出任意长度的字符串,上面提及的缺点就是,发送字符串的时候不能出现中断,要是出现中断就会打断打印,并且后面没有打印出来的也不会继续打印,这个是由于什么原因造成的目前还不是很清楚。所以如果有人需要使用这种方法的话,一定要记得在开始发送的时候将总中断的允许关闭,发送完成后再开启总中断,不然会有字符发送丢失。


如果大家有比这个方法更好的办法,不凡留言,大家一起讨论讨论。


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)