当前位置:编程学习 > VB >>

VB和单片机实现通讯程序中(“2400,n,8,1”)N和E到区别........................

请各位大虾帮帮小弟,我在VB和单片机这两方面都新手。所以................
 我现在用VB编写的一个程序,功能是
  1:用一台PC机和多个单片机进行通讯
  2:发送“01” 和单片机连接 (显示"FF"代表连接成功)
  3:发送“11” 显示单片机里面的数据(类型是:00 00 00)
  4:发送“12” 过后是修改单片机里面的数据

  但是现在遇到一个麻烦,当 MSComm1.Settings = "2400,n,8,1" 的时候发送 “01”  连接成功的
  可我发送“11”到时候就不出现任何东西。
    如果设置成MSComm1.Settings = "2400,E,8,1"的时候数据能显示出来,但是校验位必须设置成“N”
    郁闷啊.............
 程序是:
      
Private Sub Mscomm1_Oncomm()
Dim i As Integer
'...通讯事件发生

'Dim indata As Variant
Dim indata As String
Dim strData As String
Dim bte() As Byte

Select Case MSComm1.CommEvent

'Case comEvReceive '...有接受事件发生
Case 2
indata = MSComm1.Input

bte() = indata
'...注意!要通过MSComm控件发送或接收二进制数据必须用Variant类型的变量对二进

'...制Byte类型的变量进行转换!

'bte(0) = AscB(indata)

For i = 0 To UBound(bte)
If Len(Hex(bte(i))) = 1 Then
strData = strData & "0" & Hex(bte(i))
Else
strData = strData & Hex(bte(i))
End If
Next
Text2.Text = Text2 + strData

MSComm1.InBufferCount = 0 '...清空输入寄存器

End Select

End Sub

Private Sub Command1_Click()
Text2 = ""
'...发送数据

'Dim Num As Integer

Dim outbte(0) As Byte

'Num = Val(Text1.Text)

'outbte(0) = "&h" + Val(Text1.Text) 'CByte(Num)
outbte(0) = "&h" + Text1.Text 'CByte(Num)
MSComm1.OutBufferCount = 0 '...清空输出寄存器

MSComm1.Output = outbte '...发送数据

End Sub

Private Sub Command2_Click()

'...退出

Unload Me

End Sub

Private Sub Form_Load()
MSComm1.ParityReplace = 1
'...初始化

MSComm1.CommPort = 1 '...使用Com1口

MSComm1.Settings = "2400,E,8,1" '...设置通讯参数

MSComm1.PortOpen = True '...打开串口

End Sub

--------------------编程问答-------------------- .............
  没人愿意帮帮小弟5555555555555555555
 各位大哥大姐555555555555555555555555 --------------------编程问答-------------------- 发送指令后改变MSCOMM控件的属性SETTINGS --------------------编程问答-------------------- 感谢老大们的关照,小弟我感激涕零~!
  感谢!感谢!感谢!
 1、 SETTINGS属性中校验位 最好是“N”,这样的话发送“01”是可以连接上的。但是当我发送“11”的时候数据显示不出来。
 2、如果发送后我把SETTINGS属性中校验位修改成“E”的话当我发送“12”修改数据之后我再写入新的数据时就要进行校验,而且当我发送“01”连接成功过后
我再发送“01”时,这个"01"代表的是写到单片机里面数据,可当发送这个“01”之后却变成了连接单片机“01”的功能了,写到单片机的数据就改变了......................
 3、可能是我把功能没有描述清楚:发送“01”连接---发送“11”显示单片机里面数据----发送“12”修改单片机里面数据(单片机里面的数据是3位数字(123、456、854.....))
 4、发送的方式是 A:01(发送)02(发送)03(发送),这样显示的数据就因该是 321
               B:直接发送三位数字 “123” 显示的数据则应该是 “123”
--------------------编程问答-------------------- 看你的叙述感觉思路不清。
请详细叙述你上下位机的通信协议。 --------------------编程问答-------------------- 说实话我真的不知道该怎么来描述..........
  小弟我接触这个时间太短了。
 1 上位机是通过VB中的MSCOMM控件编写程序。
 2 下位机是用的M-51单片机
 3 两则是通过RS232 来进行通讯的(SETTINGS属性为“2400,n,8,1”)
 4 功能:通过电脑显示和修改单片机里面的数据
 5 过程:A 连接单片机(01) B 把单片机里面数据显示在电脑上(11)  C 通过电脑修改单片机里面数据 (12)
    --------------------编程问答-------------------- LZ:
从你叙述看,指令究竟是2个还是3个?
我以为指令或许是2个,一般指令由单字节组成在串口通信上是属于不妥的,容易引起误操作(受电磁干扰)。

指令1
&H01 &H11
用于读数据

指令2
&H01 &H12 &HXX &HXX 。。。
用于改写数据
--------------------编程问答-------------------- 哈哈,建议先把单机通信做好!!!

陕西杨工c8051f单片机博客
手机 13002928013
http://c8051fmcu.blog.sohu.com


--------------------编程问答-------------------- 单片机里面的程序不是我写的55555555555555555555555555
 控制指令是3个:01-发送(判断是否连接成功)
                 11-显示数据
                 12-修改数据
当然按照Z所说的按照 指令1/指令2 也是可以这样操作的
 问题就出在校验位N/E 
  用N就读取不了数据的
 用E呢 写数据有不完美
  ..............
   ..........
 真不知道怎么修改55555555555555555   --------------------编程问答-------------------- 估计你单片机是RS485口转RS232口的。
注意RS485口是非双工的。
或许需发送命令后有个延迟接收的问题。

问题就出在校验位N/E 
  用N就读取不了数据的
发送指令校验位设置为N
发送后即刻改校验位设置为E
接收后再改校验位设置为N
等待下次发送指令
这里需注意
更改SETTINGS时前需使串口关闭
--------------------编程问答-------------------- 老大~!
  刚才我问了一下他是TTLE电瓶转成RS232
 如果按照你说的修改SETTINGS前要关闭串口,那怎么实现通讯呢?
   还有个问题就是“01” 一个起连接作用,当连接成功后“01”就变成数据。
  怎样避免这个指令不混淆呢............. --------------------编程问答-------------------- 更改SETTINGS时前需使串口关闭
更改SETTINGS时后需使串口打开 --------------------编程问答-------------------- hs101      2008年07月30日 16点58分26秒 说:
控件的缺省值是“?” 
但是现在困扰的问题就在数据修改的时候问题就出来 
指令2 
1、先连接(比如我想连接地址为1的单片机,则发送“01”。当显示为"FF"到时候代表“01”号单片机链接成功) 
2 对连接成功的地址发送修改指令“12” 再发送修改数据 &H01,&H02,&H03 是单个发送到 
当遇到&H01的时候却显示的"FF"; 
如果发送其他的&H05,&H02,&H03 而这个时候却数据写不进去,好像问题出在校验位。可我在返回数据之后我把SETTINGS设置成了N来啊! 
问题多多............ 
老大能给我一个电话号码吗? 
我给你打电话(应该是接听免费吧)

楼主:2条消息收到.
还是我在4,6楼处的看法:

通信协议叙述不清.
一般指令由单字节组成在串口通信上是属于不妥的,容易引起误操作(受电磁干扰)。
既然你用了&H1作为检查通信连接成功测试的指令.
在修改指令时应组成&H12 &H1 &H2 &H3连续发送,不能短开,断开后,变成又在测试通信连接了. --------------------编程问答-------------------- http://topic.csdn.net/u/20080724/14/5fbcb79d-5e12-43b5-9b92-c09b875e99db.html
建议楼主看看该贴楼主对通信协议的叙述. --------------------编程问答-------------------- 大哥啊  你这个问题是 写单片机的 没有把通讯协议给你弄清楚 就是协议头没弄好 
我弹片啊几通讯的时候就是   头 数据   单片机回给我的也是 头  数据  例如 :连接时:为 头 01     byte(0)=&H01 mscomm1.output=byt  接受时把值给variant变量 string a=cstr(&H mscomm1.output) jiushi  FF了 然后有时 头 02    修改数据 头 03  01  02  03  自己 想想看看 
--------------------编程问答-------------------- 一个串口对应多个单片机?那就不能用RS232了,还有,仔细构思好你的通信协议

通常通信协议结构如下:
STX+ADD+CMD+{Para}+ETX+CHECK

STX:通信命令起始符号  这个必须选择你的数据中没有用到的字符
ADD:下位地址 也就是你的单片机的编号,是上位机分辨和哪一个单片机通信的依据
CMD:通信命令,比如,读或者写
ETX:命令结束符,和STX类似,用以表示通信命令结束
CHECK:校验码,通信命令桢的教研和,依照一定的算法计算而得,你可以自己规定自己的教研规则。 这个也可以没有,但建议添加。 --------------------编程问答-------------------- 还有一个Para是通信参数,比如你要写单片机,就需要写入参数,这个Para就是参数。读就不需要了 --------------------编程问答-------------------- 通信数据包括:起始符、机号、功能码、数据码、结束码、校验码,下位机程序中应该发送应答码,通信失败或校验出错上位机可按需要重发。与下位机的通信协议要先明确。 --------------------编程问答-------------------- 有没有奇偶校验位,关键是上位机和下位机设置都相同。要不然谁知道你发一堆高低脉冲代表啥意思
补充:VB ,  控件
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,