1 是否使用了USB转串口?如果使用了的话,换一台有串口的台式机试试看,如果好了的话,可能是转接线有问题;
2 不打开VB应用程序,只使用串口助手接收数据,如果有通信协议的话,挑一条可以固定应答的报文循环发送接收,看发送/接收字节数的比率,正常的话会是一个定值,没问题的话,证明下位机应用层到上位机链路层是没有问题的;
3 现在只剩下VB软件了,VB我不会,但是我用VC写过类似的东西,我认为可能是你的软件接收不及时导致了串口接收缓冲区满或者报文接收出现偏差,最好设计一个完备的通信协议,每次通信都要有可靠的缓冲处理、校验处理、应答处理和错误重试处理,一次应答结束后及时清除接收缓冲,这样能保证可靠、持续的通信。
我只提供解决问题的思路,不替代你解决问题,希望能有所帮助,呵呵。
1、电路上接上个MAX232
2、相关的PIC的寄存器
TXSTA(发送寄存器)
RCSTA(接收寄存器)
SPBRG(设波特率用的参数设置寄存器)
3、其它相关的
RCREG(接收)
TXREG(发送)
RCIF(接收信息中断)
以下为我则做的一个RS232做测试的一个例程 用的MAX232 4M晶体 9600波特率,PIC与电脑用RS232通信的小程序。实现功能为把PIC接收到的再发回给电脑
#include<pich>
#define uchar unsigned char
#define uint unsigned int
__CONFIG(0X2F01);//10111100000001
void init();
void main()
{
init();
while(1);
}
void init()
{
TRISC=0xff;
TXSTA=0x24;
RCSTA=0x90;
SPBRG=25;
GIE=1;
PEIE=1;
RCIE=1;
}
void interrupt com()
{
if(RCIE&&RCIF)
{
TXREG=RCREG;
while(!TRMT);
}
}
注意,这里说的高速、低速不是通常说的速度快就是高速,速度慢就是低速。这里所谓的高速、低速,指的是同一个波特率因子下的波特率的快慢。得看一下式子:
高速:波特率=fosc/16(x+1) (fosc代表外部晶振)
低速:波特率=fosc/64(x+1)
从上面的公式可以看到,对同一个X,显然用“fosc/16(x+1) ”计算得到的波特率比用“fosc/64(x+1) ”得到的波特率更快。因此上面的公式属于高速,下面的公式属于低速。
但由于波特率要用标准的,如9600,19200,因此由上面计算得到的与标准的有误差,要通过比较来确定是用高速还是低速(先误差小的)。如果高速和低速的误差一样,就随便选了。
因此不能说9600是高速还是低速!要看你用什么公式算的!
你在主函数中先把RCIF标志位清零,你做的应该是SCI串行通信吧,一上电,就表示程序开始执行了,你程序一开始执行就是要进行SCI串行通信,当然一开始就进入中断了,如果你不想这样,你可以连一个按钮,当此按钮按下后就进入中断执行SCI通信
以上就是关于PC机与单片机之间的串口通信的程序全部的内容,包括:PC机与单片机之间的串口通信的程序、如何用pic单片机写AT93C46的同步串行口的应用、pic单片机与电脑串口通信不正常:工作一段时间后电脑vb串口程序无法接收到数据,但单片机一直正常工作。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)