
VB内部是使用Unicode编码的,而串口发过来的数据则是ANSI编码的,要转换后才能在VB中正常显示:
Private Sub Timer1_Timer()Dim buf() As Byte '要设为字节数组
buf = MSComm1Input '将缓冲区内的数据读入buf数组中
If UBound(buf) >= 0 Then '判断缓冲区内是否存在数据
TextReceiveText = TextReceiveText & vbCrLf & StrConv(buf, vbUnicode) '转为Unicode
End If
End Sub
限于条件,此代码未测试,如果有问题再问我
试试这样初始化你的定时器:void UartInit(void) //9600bps@110592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器1时钟为Fosc,即1T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xDC; //设定定时初值
TH1 = 0xDC; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
}当你发送一串字符串给单片机的时候,430刚接收到第一个字符于是开始进行回发固定数据给串口助手,可还没发送完毕(发送需要时间,而你尽然在接收中断里发送,这样接受中断就得不到及时响应),你第二个字符串又进来了,于是出错了。(第一件事还没干完,你第二件、第三件。。。全部紧接的来了,要你,你不疯?)这里的问题是你没搞明白整个流程,这个程序框架也不好。这种情况下,你需要建立一个缓存区(FIFO),中断的任务就是把接收到的数据扔到缓存,置标志位,并立马退出!在主程序里发送数据,这样就不会导致接收无法及时响应问题(这个跟蓄水池一样的道理)又是你啊?和mscomm较上了?
那就在combobox1的onselect事件里面写上
if
mscomm1portopen=true
then
mscomm1portopen:=false;
if
combobox1text='com1'
then
mscomm1commport:=1;
if
combobox1text='com2'
then
mscomm1commport:=2;
mscomm1portopen:=true;
就是判断下mscomm是不是打开的,打开的就先关一下,然后根据选择的内容改变串口号,最后启用mscomm
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)