dengchongguang 发表于 2005-1-15 22:04:56

范例:使用VB编写的上机位的串口控制

我的串口搞定与大家一起分享快乐.上位机是用VB编的.

我想告诉大家是:其实串口通信也不是什么很难的事,只要用心去搞一定能作好的.

下面是二极管没有亮的软件介面.

http://cache.amobbs.com/bbs_upload782111/files_1/armok0130282.gif



这是二极管亮了的软件介面:

http://cache.amobbs.com/bbs_upload782111/files_1/armok0130283.gif



这是串口没有打开的软件介面:

http://cache.amobbs.com/bbs_upload782111/files_1/armok0130284.gif









下面是电路原理图:



点击此处打开armok0130782.pdf





下面是下载到mega 8 的C程序:



点击此处下载armok0130783.rar



下面是VB程序:(你的电脑要装VB才能运行,是我编的VB原程序,那位大哥如果会打包帮忙打一下包.)



点击此处下载armok0130784.rar





下面是下载到mega 8 的hex文件.



点击此处下载armok0130785.rar



VB 程序已经打包,把已经打包的程序上传:



点击此处下载armok0130822.rar

armok 发表于 2005-1-15 22:09:40

呵呵,如果你想更多人感受你的快乐,可以写成应用范例的形式,整理到网站中,供大家学习研究啊。

dengchongguang 发表于 2005-1-15 22:21:57

我没的摄像机,不能把实物拍出来,所以.......

http://www.527dz.com/AVR%20lab/exp7_p2.htm

这个网站有一个范例,"AVR单片机实验室版主"是阿莫

你那个网站已经有了一个串口的范例,我这个就算了吧!

我把这个贴出来一来是自己比较高兴,二来是想让大家知道串口通信其实也不是很难.

hotpower 发表于 2005-1-15 23:11:29

恭喜楼主...



眼过千遍不如手过一遍...自己付出的到底感觉不一样,不管别人说什么...

armok 发表于 2005-1-16 01:39:57

呵呵,我当然知道 527dz 有这个例子。 这个例子我们的网站也整理了。



不过如果有几个类似的例子我们也是欢迎的。这样即使一个例子有问题,起码也会有候补啊 :)



不过整理成范例需要时间与热心,这是不能勉强的事。

dengchongguang 发表于 2005-1-16 20:14:43

谢谢hotpower

dengchongguang 发表于 2005-1-16 20:42:58

上传到楼主位了。

dengchongguang 发表于 2005-1-17 15:45:36

因为是刚学VB,有可能会有意想不到的问题,如果你发现有什么问题记得告诉我.我的Email;dengchongguang@avl.com.cn

Leery 发表于 2005-1-17 15:59:48

真牛!

coole 发表于 2005-7-15 14:13:52

向你学习!

Gorgon_Meducer 发表于 2005-7-16 08:34:38

提供一个VB的串口类:

UART.cls

-------------------------

Option Explicit



'-------------------------------------------------------------------------------'

'    类说明:该类作为串口通讯属性结构体,在类间传递数据                         '

'-------------------------------------------------------------------------------'



'-------------------------------'

'         通讯属性结构体      '

'-------------------------------'

Public ComUART                      As Object               '串口对象    '

Public DelayTimer                   As Object               '定时器对象'

Public ComTransferMaxWaitTime       As Integer            '最大等待时间'

Public WaitTime                     As Integer            '延时计数器'

Public UARTPortChoose               As Integer            '串口选择    '

Public UARTSetting                  As String               '串口设定    '









UARTPort.cls

-----------------------



Option Explicit



'-------------------------------------------------------------------------------'

'    类说明:该类提供了串口通讯的基本函数                                       '

'    版本:v1.0                                                               '

'    作者:傻孩子                                                            '

'    日期:2005年7月12日                                                      '

'                                                                               '

'---------------------------------------------------------------------------'

'    [功能说明]                                                               '

'      1、允许设定串口的基本通讯状态                                          '

'      2、提供了基于单字节模式下的基本收发字节函数                              '

'                                                                               '

'-------------------------------------------------------------------------------'



Private MachineUART                  As UART



'-------------------------------------------------------------------------------'

'函数说明:串口连接函数                                                       '

'说明:    根据设定,连接相应的串口                                           '

'输入:    串口对象、定时器对象   串口选择、串口设定字符串                  '

'输出:    打开串口的操作结果(Boolean)                                        '

'-------------------------------------------------------------------------------'

Public Function StartConnect(TransferUART As UART) As Boolean

On Error GoTo Do_With_It_In_StartConnect:

      

      Set MachineUART = TransferUART

      

      With MachineUART

   

            .ComUART = .ComUART

            .DelayTimer = .ComTransferMaxWaitTime

      

            .ComUART.CommPort = .UARTPortChoose

            .ComUART.Settings = .UARTSetting

   

            ' 告诉控件读入整个缓冲区。

            .ComUART.InputLen = 1

            .ComUART.InputMode = comInputModeBinary

            ' 打开端口。

      

            .ComUART.PortOpen = True

            StartConnect = True

      

      End With

      

Exit Function

Do_With_It_In_StartConnect:

'----------错误处理程序----------

   StartConnect = False

   Err.Clear

End Function



'-------------------------------------------------------------------------------'

'函数说明:串口单字节发送函数                                                 '

'说明:    发送指定的字节,并且等待指定的回应                                 '

'输入:    需要发送的字节等待回应的字符(给/0时表示不等待回应)             '

'输出:    发送是否成功(是否受到了指定的回应)                               '

'-------------------------------------------------------------------------------'

Public Function SendBytes(Datas As Byte, WaitSymble As Byte) As Boolean

On Error GoTo Do_With_It_In_SendBytes

    Dim Temp() As Byte

    Dim TempData() As Byte

    Dim a As Integer

    Dim Flag As Boolean

    ReDim TempData(0 To 0)

    ReDim Temp(0 To 0)

   

    With MachineUART

      TempData(0) = Datas

      .ComUART.Output = TempData()

      .WaitTime = .ComTransferMaxWaitTime

      .DelayTimer.Enabled = True

   

   

      If WaitSymble = 0 Then

            Flag = True

      Else

            Flag = False

      End If



re:



      If .ComUART.InBufferCount = 0 Then

            DoEvents

            GoTo Judge

      End If

   

   

      Temp = .ComUART.Input

      DoEvents



   

      For a = 0 To 0

   

            If WaitSymble = 0 Then

                Flag = True

            End If

      

            If Temp(a) = WaitSymble Then

                Flag = True

            End If

      Next a

   

Judge:

   

      If Flag = False And .WaitTime > 0 Then

            GoTo re:

      End If

   

      If Flag = False Then

            SendBytes = False

      Else

            SendBytes = True

      End If

   

      .DelayTimer.Enabled = False

      SendBytes = True

      

    End With

   

    Exit Function



Do_With_It_In_SendBytes:

'-----------------错误处理程序-------------------'

    SendBytes = False

    Err.Clear

End Function



'-------------------------------------------------------------------------------'

'函数说明:串口单字节接收函数                                                 '

'说明:    等待字节,并且根据要求做出回应                                     '

'输入:    需要等待的内容   回应的内容   工作模式                           '

'输出:    接收是否成功                                                       '

'-------------------------------------------------------------------------------'

Public Function ReceiveBytes(Datas As Byte, SendSymble As Byte, Models) As Boolean

'-----------------------------------'

'Models                说明       '

'-----------------------------------'

'    0         等待一个值并立即反 '

'                回SendSymble的信号 '

'                受到的数据放在Dates'

'    1         等待一个特定的值返 '

'                回SendSymble的信号 '

'    2         等待一个值,放在   '

'                Dates里面,不返回'

'    3         等待一个特定的值, '

'                不返回             '

'    4         收到什么返回什么   '

'-----------------------------------'

On Error GoTo Do_With_It_In_ReceiveBytes

    Dim Temp() As Byte

    Dim TempData() As Byte

    Dim Flag As Boolean

    ReDim Temp(0 To 0)

    ReDim TempData(0 To 0)

   

   

   

    With MachineUART

      .WaitTime = 5

      TempData(0) = SendSymble

      .DelayTimer.Enabled = True

   

      Select Case Models

   

            Case Is = 0

                '等待一个值,立即返回SendSymble信号,并将数据放到Dates变量里

                Flag = False

                Do

                  DoEvents

                  If .ComUART.InBufferCount > 0 Then

                        Temp = .ComUART.Input

                        Datas = Temp(0)

                        .ComUART.Output = TempData

                        Flag = True

                  End If

                Loop While Flag = False And .WaitTime > 0

            

                If Flag = False Then

                  ReceiveBytes = False

                Else

                  ReceiveBytes = True

                End If

                .DelayTimer.Enabled = False

                Exit Function

      

            Case Is = 1

                '等待一个特定的值,立即返回SendSymble信号

                Flag = False

                Do

                  DoEvents

                  If .ComUART.InBufferCount > 0 Then

                        Temp = .ComUART.Input

                  

                        If Datas = Temp(0) Then

                            .ComUART.Output = TempData

                            Flag = True

                        End If

                  End If

                Loop While Flag = False And .WaitTime > 0

            

                If Flag = False Then

                  ReceiveBytes = False

                Else

                  ReceiveBytes = True

                End If

                .DelayTimer.Enabled = False

                Exit Function

            

            Case Is = 2

                '等待一个值,将其放入Datas ,不返回

                Flag = False

                Do

                  DoEvents

                  If .ComUART.InBufferCount > 0 Then

                        Temp = .ComUART.Input

                        Datas = Temp(0)

                        Flag = True

                  End If

                Loop While Flag = False And .WaitTime > 0

            

                If Flag = False Then

                  ReceiveBytes = False

                Else

                  ReceiveBytes = True

                End If

                .DelayTimer.Enabled = False

                Exit Function

            

            Case Is = 3

                '等待一个特定的值,不返回

                Flag = False

                Do

                  DoEvents

                  If .ComUART.InBufferCount > 0 Then

                        Temp = .ComUART.Input

                  

                        If Datas = Temp(0) Then

                            Flag = True

                        End If

                  End If

                Loop While Flag = False And .WaitTime > 0

            

                If Flag = False Then

                  ReceiveBytes = False

                Else

                  ReceiveBytes = True

                End If

                .DelayTimer.Enabled = False

                Exit Function

      

            Case Is = 4

                '收到什么返回什么

                Flag = False

                Do

                  DoEvents

                  If .ComUART.InBufferCount > 0 Then

                        Temp = .ComUART.Input

                        Datas = Temp(0)

                        .ComUART.Output = Temp

                        Flag = True

                  End If

                Loop While Flag = False And .WaitTime > 0

            

                If Flag = False Then

                  ReceiveBytes = False

                Else

                  ReceiveBytes = True

                End If

                .DelayTimer.Enabled = False

                Exit Function



      End Select

    End With

Do_With_It_In_ReceiveBytes:

'-------------错误处理程序----------------'

    Err.Clear

    ReceiveBytes = False

End Function






-----此内容被Gorgon Meducer于2005-07-16,08:35:30编辑过

Gorgon_Meducer 发表于 2005-7-16 08:48:35

该类的是用方法:

1、在窗体中添加两个控件:MSComm控件和Timer控件。

2、在模块中声明两个类。分别用于使用如上的UARTPort类,其中UART类是用来做传输数据的结构体的。

   例如:

   Public MachineTransferWork            As UARTPort

   Public MachineInfo                      As UART

3、在Timer控件中填写相应的代码作为延时操作的依据:

   例如:

   Private Sub Timer_TransferDelay_Timer()



    With MachineTransferWork

      If .WaitTime > 0 Then

            .WaitTime = .WaitTime - 1

      Else

            Timer_TransferDelay.Enabled = False

      End If

    End With

   

   End Sub

4、使用的前,先初始化一下各个类。

   例如:

   Set MachineTransferWork = New UARTPort

   Set MachineInfo = New UART

5、描述一下要打开的串口的信息,填写UART类的各个内容。其中串口设定的内容请参照MSComm Setting属性的设置方法。

   通过Set方法为对象变量赋值。也就是把串口控件,定时器控件赋给相应的变量。

6、使用

   1)打开一个串口:

    MachineTransferWork.StartConnect(MachineInfo)      '如果成功,函数返回True

   2)发送一个字节,并且等待下位机返回内容作为校验。

    MachineTransferWork.SendBytes(&HAC,&HAC)         '发送AC,等待AC ,成功返回True

   3)发送一个字节,不要求校验

    MachineTransferWork.SendBytes(&HAC,0)            '发送AC,不要求校验,成功返回True

   4)等待接收一个字节,收到以后返回信号         

    MachineTransferWork.ReceiveBytes(&HA1,&HAC,1)      '等待接收A1,收到以后返回AC

   (接收字节的其他模式参见函数模式说明)

   ……

   

   


-----此内容被Gorgon Meducer于2005-07-16,08:54:53编辑过

armok 发表于 2005-7-16 08:52:01

好。谢谢。

ilan2003 发表于 2005-7-16 10:01:54

牛人

dengchongguang 发表于 2005-7-17 12:51:56

用串口类有什么好处?

Gorgon_Meducer 发表于 2005-7-17 21:37:11

好处就是,可以重复利用,不用每一次都写一样的代码,而其封装过了,代码的可靠性好一点……其他没有什么,只是一个个人习惯,你完全可以把这些写道模块里面去。

以下为个人观点:

VB本身具有快速开发的特点,如果我们为常用的功能模块进行打包,以后的开发就像搭积木一样简单,实现快速工程(Rapid Application Development)。

liushilei1234 发表于 2005-10-16 15:24:46

搂主:



你的电路图上max232的16引脚不接+5V吗〉????????

liushilei1234 发表于 2005-10-16 16:12:44

点击此处打开armok0178526.pdf





如此图所示
-----此内容被liushilei1234于2005-10-16,16:14:34编辑过

TKD2002 发表于 2005-10-16 16:49:21

请教一下楼主,我在VB里面找不到MSCOMM控件是不是板本问题,你用的是那个板本啊?

dengchongguang 发表于 2005-10-16 17:35:29

TO:liushilei1234

是我搞错了,要接到5V.



to:TKD2002

要加一个控件,VB自带的:Microsoft Comm Control 6.0

liushilei1234 发表于 2005-10-16 22:58:36

请教一下:







我看到程序中OSCCAL=0Xa0;





能讲解一下怎样配制振荡器标定寄存器- OSCCAL吗?



这个寄存器我一直都不明白怎么回事

dengchongguang 发表于 2005-10-17 10:24:32

它的作用就是AVR芯片在生产的过程中内部RC振荡器的电阻阻值、电容容值会有偏差。

所以要用这个标定寄存器作补偿。

所以每一个AVR芯片的的补偿值都是不一样的。



配制振荡器标定寄存器的方法:

1.点菜单“Command”

http://cache.amobbs.com/bbs_upload782111/files_4/armok0178667.jpg

2.点下拉菜单里的“Osc Cal.Bytes”

http://cache.amobbs.com/bbs_upload782111/files_4/armok0178668.jpg

3.然后就弹出这个窗口,这个窗口会用了吧?

http://cache.amobbs.com/bbs_upload782111/files_4/armok0178669.jpg

wswh2o 发表于 2005-11-3 13:38:27

UBRRL=(fosc/16/(baud+1))%256;

UBRRH=(fosc/16/(baud+1))/256;

楼主的波特率是这么算得。

可datasheet上是

UBRR=(fosc/16/buad-1)

怎么回事????????/

wswh2o 发表于 2005-11-3 20:19:16

终于好了,我是按datasheet上作的,用的6m晶体,在2400是可能误差太大,不行,设成9600

就好了。

wsdzj 发表于 2005-11-8 19:11:29

请问下位机接收的数据不用校验吗????一定能保证接收数据正确???小弟是菜鸟,不对的地方请多指教!!

zh1112ou 发表于 2005-11-8 22:55:54

顶一下

dengchongguang 发表于 2005-11-9 11:31:22

用校验当然好一点.

yu_jun_feng 发表于 2005-12-27 16:50:13

http://cache.amobbs.com/bbs_upload782111/files_5/armok0194411.JPG

点击此处下载armok0194410.rar



我前些天也搞了一个生产线看板联网程序,我也是刚学VB ,欢迎有空交流.波特率为9600,如果你的下位机没有问题,就可以接收正常,高手不要见笑!
-----此内容被yu_jun_feng于2005-12-27,16:56:22编辑过

lsnba 发表于 2006-1-6 14:36:59

想问一下dengchongguang

    我想做的是在VB窗口中创建一个按钮控件(PC机通过串口与单片机通信),工作要求是这样的,按下按钮控件-------单片机控制的指示灯亮;松开按钮控件-------单片机控制的指示灯灭;也就是说,比如按下按钮时,PC机不停发送01H给单片机,单片机收到01H后第一个指示灯亮,鼠标松开按钮,PC机停止发送01H,单片机没有接收到01H,指示灯灭。这样的VB程序是怎样做,并请知道的大虾告之。先谢谢了。

lsnba 发表于 2006-1-9 09:00:45

怎么没人回复一下,告之一下

favr 发表于 2006-1-15 13:24:52

因为你问dengchongguang当然大家就不回答了。



简单地说,使用command按钮的MouseDown事件和MouseUp事件就可实现该功能了,不过不要连续发01H,你可以改为发01H时亮灯,发02H时灭灯,大概这样:

Private Sub Command1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

    PutToMCU &H1

End Sub



Private Sub Command1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)

    PutToMCU &H2

End Sub



OK?

wudi 发表于 2006-1-15 15:57:40

我用VB写了一个串口多机通讯轮训的上位机程序,回头整理整理发上来

lqnxtd 发表于 2006-1-24 15:07:34

不错,我以前学VB时也做了一个简单的,不过现在不知放那里去啦,一起努力哈

lsnba 发表于 2006-2-7 15:06:05

谢谢这么多热心的高手大虾

ygx7l 发表于 2006-2-19 15:31:52

求教各位高手:搂主所写的串口程序我终于调通了,也可以亮二极管,但是我把程序稍作改动,用单片机发送一个数据,在vb界面用一个文本框接收却无论如何接收不到数据,改用网站上下载的串口调试软件也接收不到数据,到底什么原因还请知道的大虾告之,谢谢了!

ygx7l 发表于 2006-2-21 09:36:28

怎么没有人回答啊,是不是我没说清楚。具体就是我在下载到mega 8 的C程序里加了一条puts("串口演示"),在vb程序里加了一个文本框和一条text1.text=MSComm1.input语句,可运行后文本框却收不到数据,简单点说就是单片机只能接受不能发送数据,不知各位有没有人碰到过类似问题,还请帮忙解答一下。

pmpo 发表于 2006-3-8 12:55:44

没学过VB,拿了楼主的程序花了点时间搞了一下,弄成一个给DS1302时钟校时的程序,还可以回显单片机发回的消息。

楼上的程序改一下看看,

dim instring as string

instring=MSComm1.input

text1.text=instring

pmpo 发表于 2006-3-9 13:07:17

发现楼上几句似乎没什么意义,在晓奇网站看到一个接收程序,我改了一下,可以显示字符。当然首先要在以下这个子程序

Private Sub Form_Load() '初始化

里加一句

MSComm1.RThreshold = 1'设置接收一个字节产生OnComm事件





Private Sub MSComm1_OnComm()

    Dim S() As Byte

   Dim SS(1024) As Byte

    Static N As Long

    If (MSComm1.CommEvent = comEvReceive) Then

      S = MSComm1.Input                      '只要有数据就收进来,哪怕只是一个

      For i = 0 To UBound(S)               '一个数据包可能产生若干个oncomm事件

            Text9.Text = Text9.Text + Right(Chr(S(i)), 3)

            SS(N + i) = S(i)               '接收数据包缓存于SS()

            N = N + UBound(S)

      Next i

    End If

End Sub

以下是我在晓奇网站看到的程序

原贴地址为:http://www.xiao-qi.com/netfile/Mscomm.html



MSCOMM控件是个好东西,如果您能够充分了解他,他会为您衷心的效劳。



    大致看了一下下午有关讨论MSCOMM的话题,觉得有必要说说我的心得,我一般只做硬件,没有系统的学过软件,只是业余时间

学学用用,多少掌握了一点,也在此拿出来玩玩,不知有错没有,我可是以为我已经做的很好了^_^



这是一个VB通用串口事件驱动接收程序。一次性接收一个数据包,数据包可以为任意字节,保证不会丢失一个数据!

Private Sub MSComm_OnComm()

    Dim S() As Byte

    Dim SS(1024) As Byte

    Static N As Long

    Static T As Variant



    If (MSComm.CommEvent = comEvReceive) Then

      S = MSComm.Input                      '只要有数据就收进来,哪怕只是一个

      If (Timer - T > 0.01) Then            '间隔10MS以上就认为是一个新的包

            text1=""                        'text1用于搜集和显示接收(HEX格式)

            N = 0

      End If

      T = Timer

      For i = 0 To UBound(S)               '一个数据包可能产生若干个oncomm事件

            Text1.Text = Text1.Text & Right("0" & Hex(S(i)) & "H", 3) + " "

            SS(N+i)=S(i)                     '接收数据包缓存于SS()

            N=N+UBound(S)

      Next i

    End If

End Sub

pmpo 发表于 2006-3-9 13:20:30

原来还可以再精简,呵呵,没学过VB走了很多歪路

Private Sub MSComm1_OnComm()

    Dim S() As Byte

    If (MSComm1.CommEvent = comEvReceive) Then

      S = MSComm1.Input                      '只要有数据就收进来,哪怕只是一个

            Text9.Text = Text9.Text + Right(Chr(S(i)), 1)

    End If

End Sub

favr 发表于 2006-3-9 14:10:25

楼上的程序也不可靠



1、SS()从来没用过,放在事件内干吗?

2、VB的 Timer 函数是不准确的,最短的时间间隔是一个系统的时钟滴答(好象是12.5ms),根本算不出一个整ms来着。

3、MSComm_OnComm事件是准同步的,设MSComm1.RThreshold = 1,当系统收到一个字符时会产生一次事件,但当进入事件后接收系统还继续工作,处理是要时间的(特别在事件中作复杂处理时),如果接收缓冲区不够大,而通讯速率足够快时有可能产生缓冲区溢出,还是要丢数据。

ygx7l 发表于 2006-3-10 10:47:54

谢谢各位,但我仍然没有调通。我觉得应该不是vb程序的问题,因为我用其他的串口调试软件同样接收不到数据,问题应该出在c程序或者硬件方面,我把我的c程序传上来,还请各位帮我看看。另外我查看了一下max232的数据手册它的接口电路电容用的是有极性的电解电容,而示例中电路用的是没有极性的普通电容,会不会是这个原因,因为手头没有合适的电解电容,我也没有试。

#include <iom8v.h>

#define fosc 8000000 //晶振8MHZ

#define baud 19200       //波特率

/*                端口初始化函数                */

void port_init(void)

{

PORTC &= 0xF0;

DDRC|= 0x0F;

}

/*                字符输出函数                */

void putchar(unsigned char c)

        {       

   while (!(UCSRA&(1<<UDRE)));

       UDR=c;   

        }

/*                字符输入函数                */       

unsigned char getchar(void)

        {

       while(!(UCSRA& (1<<RXC)));

   return UDR;

        }               

/*                        字符串输出函数                  */       

int puts(char *s)

        {

        while (*s)

                {

                putchar(*s);

                s++;

                }       

    putchar(0x0a);//回车换行

        putchar(0x0d);

        return 1;

        }

/*                  不含回车换行的字符串输出函数        */       

void putstr(char *s)

        {

        while (*s)

                {

                putchar(*s);

                s++;

                }       

        }       

/*                        UART初始化                                */       

void uart_init(void)

{

OSCCAL=0Xa0;

UCSRB=(1<<RXEN)|(1<<TXEN);//允许发送和接收

UBRRL=(fosc/16/(baud+1))%256;

UBRRH=(fosc/16/(baud+1))/256;

UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位STOP位

}

/*                        RS232通信main函数                */

void main(void)

{

unsigned char i;

port_init();

uart_init();

while(1)

    {

       i=getchar();

       switch (i)

          {

               case 0x31: PORTC |= 0x01;

               puts("第1个二极管亮");

               break;//第1个二极管亮

               case 0x32: PORTC &= 0xfe;

               puts("第1个二极管灭");

               break;//第1个二极管灭

               case 0x33: PORTC |= 0x02;

               puts("第2个二极管亮");

               break;//第2个二极管亮

               case 0x34: PORTC &= 0xfd;

               puts("第2个二极管灭");

               break;//第2个二极管灭

               default: break;

                }

        }

}

ygx7l 发表于 2006-3-10 10:50:50

还有,下图是我的熔丝位配置,不知是不是这里的问题?

http://cache.amobbs.com/bbs_upload782111/files_5/armok01106328.jpg

pmpo 发表于 2006-3-10 13:51:34

为什么非要发中文呢?中文没经过转换看不出来的,但是你也应该可以看到其中的一个数字。max232我通常都用0.1u的瓷片电容,没关系的,怀疑的话可以将连到单片机的收发端接起来,用串口调试助手测试。

ygx7l 发表于 2006-3-11 11:09:15

我把电路重新焊了一遍,终于可以调通了,看来还是我不小心焊接出了问题哈,谢谢各位了!

qtxo 发表于 2006-3-21 10:10:46

楼主正是牛!我也想用VB编串口通讯!我先看看吧,不会了还要向你请教哦!

shotstar 发表于 2006-10-7 10:48:58

VB中的MSComm控件怎么加进来啊 工程-部件里怎么没有的啊 ?

j805 发表于 2006-10-7 12:54:16

我现在学VC,要是有VC的例子就好了,不过还是谢谢以上各位!

//////////////////////////////////////////////////////////////



http://www.gjwtech.com/

看看,我也是在那儿起步的!

microcon 发表于 2006-10-7 23:41:24

好啊,我原来使用MSComm_OnComm事件,数据一多超过8或9个以上就老丢。回头试试楼主的程序看看。

zhongxinhjb 发表于 2006-11-21 11:48:22

#include <iom64v.h>

#define UDRE 5

#define RXC7

#define RXEN 4

#define TXEN3



/*                端口初始化函数                */

void port_init(void)

{

PORTG= 0xFF;

DDRG= 0xff;

}

/*                字符输出函数                */

void putchar(unsigned char c)

        {       

   while (!(UCSR1A&(1<<UDRE)));

       UDR1=c;   

        }

/*                字符输入函数                */       

unsigned char getchar(void)

        {

       while(!(UCSR1A& (1<<RXC)));

   return UDR1;

        }               

/*                        字符串输出函数                  */       

int puts(char *s)

        {

        while (*s)

                {

                putchar(*s);

                s++;

                }       

    putchar(0x0a);//回车换行

        putchar(0x0d);

        return 1;

        }

/*                  不含回车换行的字符串输出函数        */       

void putstr(char *s)

        {

        while (*s)

                {

                putchar(*s);

                s++;

                }       

        }

void delay_1ms(void)               //1ms延时函数

{

   unsigned int i;

   for (i=0;i<1140;i++);

}       

       

void delay_nms(unsigned int n)       //N ms延时函数

{

   unsigned int i=0;

   for (i=0;i<n;i++)

   delay_1ms();

}       

/*                        UART初始化                                */       

void uart_init(void)

{

//LI();

// 0X00;   // I/O数据寄存器

UCSR1A = (1<<UDRE);   // 数据寄存器空标志

UCSR1B = (1<<RXEN)|(1<<TXEN);//|(1<<TXCIE); // RXEN1,TXEN1使能

UCSR1C = 0X06; //8 位数据传送

UBRR1H = 0x00;

UBRR1L = 0x51;//8M频率波特率:9600

// OSCCAL=0Xa0;

//UCSR1B=(1<<RXEN1)|(1<<TXEN1);//允许发送和接收

//UBRR1L=(fosc/16/(baud+1))%256;

//UBRR1H=(fosc/16/(baud+1))/256;

//UCSR1C=(1<<UCSZ11)|(1<<UCSZ10);//8位数据+1位STOP位

}

/*                        RS232通信main函数                */

void main(void)

{

unsigned char i;

port_init();

uart_init();

while(1)

    {

                         //PORTG= 0xf0;

            //delay_nms(1000);

            //PORTG= 0xff;

            //delay_nms(1000);

            i=getchar();

       switch (i)

          {

               case 0X31: PORTG &= 0xfe; break;//第1个二极管亮

               case 0X32: PORTG |= 0x01; break;//第1个二极管灭

               //case 0x33: PORTG |= 0x02; break;//第2个二极管亮

                // case 0x34: PORTG &= 0xfd; break;//第2个二极管灭

               //case 0x35: PORTG |= 0x04; break;//第3个二极管亮

                // case 0x36: PORTG &= 0xfb; break;//第3个二极管灭

                // case 0x37: PORTG |= 0x08; break;//第4个二极管亮

                // case 0x38: PORTG &= 0xf7; break;//第4个二极管灭

               default: break;

                }

        }

}





没调通 哪的问题?

guantingwei 发表于 2006-11-21 12:53:27

hotpower 菜农是个好老师啊……

懂得学技术的真谛

看一百遍,不如一练

chengjia535 发表于 2007-9-26 18:26:40

这个帖子怎么已经沉了这么长时间了,顶起来!

lin28 发表于 2007-12-5 14:29:58

tuy0326 发表于 2007-12-6 01:49:47

顶下

5000322 发表于 2008-3-8 11:53:29

大家好!我这里有法拉电容,免费发放,感兴趣的朋友电邮:5000322@163.com

zhujinyu 发表于 2008-9-11 09:18:25

学习中,多谢各位

mcs_yh 发表于 2009-2-19 13:07:38

软件界面有点难看

hustwhzhaobin 发表于 2009-3-23 20:21:05

在此我看到人性的光辉,无私奉献上下求索的精神

向各位学习,向各位致敬

Offer 发表于 2009-3-23 23:00:24

东西很不错。继续学习!!

ql-dz.com 发表于 2009-4-30 13:49:51

楼主是好人好贴.

xjmlfm 发表于 2009-5-1 12:41:54

学习了,谢谢楼主

aohuahua 发表于 2009-8-23 22:21:03

顶一下

rake 发表于 2010-7-6 15:05:34

学习

tom030704 发表于 2010-7-21 17:20:36

能不能来个51版的啊……手上没avr的片子,也没学过avr………………

jiaweiqiang 发表于 2010-8-13 11:39:14

留个记号,顶!

swustlx86 发表于 2010-8-13 11:45:20

mark

andrew_dj 发表于 2010-8-13 12:58:43

学习了

120908069 发表于 2010-8-20 02:37:09

GOOD

lisj2003 发表于 2010-10-20 20:53:53

mark,3q

durable 发表于 2010-10-20 22:17:16

mark

zyw19987 发表于 2010-11-9 23:32:33

万能论坛啊vb也有例子

icecoli 发表于 2010-11-10 00:48:40

用串口调试程序很方便

honey655729 发表于 2010-11-20 13:28:12

mark

zbjshower 发表于 2010-11-20 14:55:41

mark

cyhyx 发表于 2010-11-20 22:11:48

vb学习中

Tomas_Yung 发表于 2010-12-29 22:12:27

跟我刚做的有点像,我改用usb转串口的!

xstt 发表于 2010-12-30 08:10:19

mark

yanghengxu 发表于 2011-4-21 12:07:00

Mark

georgemcu 发表于 2011-4-21 22:53:30

MARK

zuanmuchong 发表于 2011-4-22 11:56:52

向各位大侠学习 mark

wwwjjjwww 发表于 2011-4-22 13:26:30

用EXCEL 的vba也可以做串口通信,我做了一个例子,找一下传上来大家看看。挺好玩的,excel直接读取操作串口。哈哈。

lovefei 发表于 2011-7-22 16:51:07

mark

good200xyz 发表于 2011-7-22 22:56:37

回复【87楼】lovefei
-----------------------------------------------------------------------

很棒!正在研究VB串口与AVR通信。学习了!

songjunjie 发表于 2012-7-14 10:34:42

yu_jun_feng 发表于 2005-12-27 16:50 static/image/common/back.gif
点击此处下载armok0194410.rar



我前些天也搞了一个生产线看板联网程序,我也是刚学VB ,欢迎有空交流.波特 ...

您好,我有个看板正好跟你这个差不多,请问源码能提供吗,谢谢!或是根据我上传的通讯协议修改一份也可,跪求!!

huang_guo_ming 发表于 2012-7-15 23:57:51

vb好搞还是vc好搞?我的老师说vc不难,我的学长都搞vb来编上位机······

houzengmin 发表于 2012-9-24 11:35:55

{:victory:}{:handshake:}{:handshake:}
页: [1]
查看完整版本: 范例:使用VB编写的上机位的串口控制