PIC的串口程序为什么要这么写?帮助下

发布于2022-07-30 15:55:29

#define uchar unsigned char#define uint unsigned intuchar buffer[6];uchar *p=buffer;main(){ADCON0=0X00; ADCON1=0X06; TXSTA=0X24; RCSTA=0X90; SPBRG=0X19; TRISC6=1; TRISC7=1; GIE=1; PEIE=1; RCIE=1;}jieshou(){  uchar i,j;   for(i=0;i<6;i++)   {       for(j=0;j<255;j++)      {         if(RCIF==1)         {            *(p+i)=RCREG;           RCIF=0;           break;         }      }   }}interrupt zhongduan(){        if(RCIF==1)     jieshou();}PC串口接收数据给单片机,我写的这个可行,可不明白的是为什么接收子函数要加2级循环,如果删去,  for(j=0;j<255;j++),那么串口写的只能得到第一个值,为什么,是时钟周期的问题吗?会的说一下 还可添加0张

3个回答
admin
网友回答2022-07-30
正如楼上说的,这是为了多次接收数据并且在每次接收后都延时一下以便处理完上一次后再break到上一级for循环去接收。如果去掉第二个for那么后面的break是会跳出第一个for循环然后这个子程序结束并返回中断最后跳出中断服务程序,所以只接受一次。
另外,我忍不住要抨击一下这个程序的思路:非常垃圾——做单片机或者ARM等程序里,中断不要嵌套程序。虽然PIC是八级堆栈,就是你可以嵌套中断八次或者说是中断里嵌八次子程序。但不要这样做,这样导致的后果是导致其他功能没法运行。虽然你这个程序貌似是一个实验性程序,没有其他功能只是做这个接收,没有什么大碍。但如果你习惯这样做的话,以后做产品是会有很大的技术漏洞的,程序大了之后需要用到堆栈的地方就多了,不够使的话就会出现堆栈溢出从而出现问题。 千万不要在中断里嵌子程序。
admin
网友回答2022-07-30

1\枚举串口,需要枚举系统中存在的串口.我是参考网上一个enumserial的源码. 

===============================================================================
从注册表里可以获得串口列表,然后可以尝试打开,没有成功的估计是被内部占用。

2\中文处理,接收时,有可能一个中文的2个字节被分成2次接收到,需要处理,否则会在memo控件中显示成乱码.我搞的比较繁琐,虽然速度还是满足要求. 
这个我也很头疼,一般靠协议来避免,比如有明显的包头、包尾,收完整后再处理。不知道楼主有没有好办法,我想看他的dll源码的目的也在此,比方modbus的rtu模式,你就需要用超时来确定接收完整
admin
网友回答2022-07-30
我不懂PIC,不过看了看你的程序,感觉 for(j=0;j<255;j++)实际上就是进行了256次接收尝试。在这256次中一旦接收到了,就接收下一个,有点延迟函数的作用。

回到
顶部