作者Deltaguita (贝纳颂)
看板Electronics
标题[问题] 8051与VB通讯的资料去回不同
时间Wed Mar 7 16:01:17 2012
请教一下各位前辈
小弟正在弄一个透过VB2010(PC)-RS232-8051 资料去回的实习
以便将来我监控资料
目前可以用VB把资料传过去,也可以把资料传回来
可是传过去的资料没有办法正确的传回来
例如我传送1 回来是g(113)
传送2 回来是r(114)
b 194
c 195
可以请问 问题是出在哪个环节吗?
300P币答谢!
VB CODE:
********************变数定义****************************
Dim i As Integer
Dim aa As Integer = 0
Dim send_data As String
Dim input As Integer = 0
Dim receive_data As String
Dim Ctr As Control
Dim BRx(256) As char
*********************************************************
UART设定
*********************************************************
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
SerialPort1.DataBits = 8
SerialPort1.StopBits = IO.Ports.StopBits.One
SerialPort1.Parity = IO.Ports.Parity.None
*********************************************************
RECEIVE
*********************************************************
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Timer1.Tick
For Me.i = 0 To 255 'BRX CLEAR
BRx(i) = 0
Next
receive_data = SerialPort1.BytesToRead
If receive_data = 0 Then Exit Sub
If receive_data > 256 Then
receive_data = 256
End If
For Me.j = 1 To receive_data
BRx(input) = SerialPort1.ReadByte
aa = BRx(input)
txt_receive.Text = txt_receive.Text & Chr(BRx(input))
input = input + 1
Next
input = 0
Timer1.Enabled = False
For Me.i = 0 To 255
BRx(i) = 0
Next
Timer1.Interval = 500
Timer1.Enabled = True
***********************************************************************
SEND
***********************************************************************
Private Sub send_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles send.Click
send_data = 0
For Me.i = 0 To Len(txtSend.Text) - 1
send_data = Mid(txtSend.Text, 1 + i, 1)
Me.SerialPort1.Write(send_data)
Call delay(90000)
Next i
End Sub
8051 CODE
/*------------------------------------------------
串口初始化
------------------------------------------------*/
void InitUART (void)
{
SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收
TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重装
TH1 = 0xFD; // TH1: 重装值 9600 串列传输速率 晶振12MHz
TR1 = 1; // TR1: timer 1 打开
EA = 1; //打开总中断
// ES = 1; //打开串口中断
}
-------------------------------------------------
串口中断程式
------------------------------------------------*/
void UART_SER (void) interrupt 4 //串列中断服务程式
{
unsigned char Temp; //定义临时变数
if(RI) //判断是接收中断产生
{
RI=0; //标志位元清零
Temp=SBUF; //读入缓冲区的值
P1=Temp; //把值输出到P1口,用於观察
SBUF=Temp; //把接收到的值再发回电脑端
}
if(TI) //如果是发送标志位元,清零
TI=0;
}
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 60.251.222.115
※ Deltaguita:转录至看板 Visual_Basic 03/07 16:07
※ 编辑: Deltaguita 来自: 60.251.222.115 (03/07 16:08)
※ 编辑: Deltaguita 来自: 60.251.222.115 (03/07 16:13)
※ 编辑: Deltaguita 来自: 60.251.222.115 (03/07 16:15)
1F:推 Anal:buadrate 的设定对吗?通常rs232出错都是这个问题 03/07 18:38
2F:→ narcissusli:从这4个文字的传收来看,是51端UART的设定有问题. 03/07 21:27
3F:→ Deltaguita:好的 小弟明天放上buadrate那边的设定 顺便修改看看 03/07 21:55
4F:推 su35:我觉得你VB的程式会错误喔 他可能还没全部接收完 你程式就跑 03/07 22:06
5F:→ su35:完了 Buadrate那 要看你的振荡器的时脉 书本上跟你的板子用的 03/07 22:07
6F:→ su35:震荡器 不见得一样的 03/07 22:08
7F:→ su35:我自己VB是用事件中断去执行 遇到中断才会去执行 单晶片那传 03/07 22:10
8F:→ su35:送自订的协定封包 所以我会有表头档这些资料 03/07 22:11
9F:→ su35:知道会收到多少个 并且计时 超过时间还没收完就放弃 收到正确 03/07 22:11
10F:→ su35:的BYTE就会接下去执行 03/07 22:12
※ 编辑: Deltaguita 来自: 60.251.222.115 (03/08 11:04)
※ 编辑: Deltaguita 来自: 60.251.222.115 (03/08 11:09)
※ 编辑: Deltaguita 来自: 60.251.222.115 (03/08 15:05)
11F:→ Deltaguita:报告各位前辈 板子上面的是写12M 注解写11.0596 03/08 15:06
12F:→ Deltaguita:请问是一样的吗? 03/08 15:07
13F:→ narcissusli:不一样喔,通常11.0592MHz是为了9600bps用的,如果用12M 03/11 21:26
14F:→ narcissusli:会导致51端的传收偏移,这可以解释你传1/2/b/c的结果. 03/11 21:29
15F:→ narcissusli:用2进位去看就知道了. 03/11 21:30
16F:→ Deltaguita:感谢 已经解决! 03/12 15:53