搜索
bottom↓
回复: 92

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

[复制链接]

出0入0汤圆

发表于 2005-1-15 22:04:56 | 显示全部楼层 |阅读模式
我的串口搞定与大家一起分享快乐.上位机是用VB编的.

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

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





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





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












下面是电路原理图:



点击此处打开armok0130782.pdf





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



点击此处下载armok0130783.rar



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



点击此处下载armok0130784.rar





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



点击此处下载armok0130785.rar



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



点击此处下载armok0130822.rar
头像被屏蔽

出0入0汤圆

发表于 2005-1-15 22:09:40 | 显示全部楼层
呵呵,如果你想更多人感受你的快乐,可以写成应用范例的形式,整理到网站中,供大家学习研究啊。

出0入0汤圆

 楼主| 发表于 2005-1-15 22:21:57 | 显示全部楼层
我没的摄像机,不能把实物拍出来,所以.......

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

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

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

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

出0入0汤圆

发表于 2005-1-15 23:11:29 | 显示全部楼层
恭喜楼主...



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

出0入0汤圆

发表于 2005-1-16 01:39:57 | 显示全部楼层
呵呵,我当然知道 527dz 有这个例子。 这个例子我们的网站也整理了。



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



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

出0入0汤圆

 楼主| 发表于 2005-1-16 20:14:43 | 显示全部楼层
谢谢hotpower

出0入0汤圆

 楼主| 发表于 2005-1-16 20:42:58 | 显示全部楼层
上传到楼主位了。

出0入0汤圆

 楼主| 发表于 2005-1-17 15:45:36 | 显示全部楼层
因为是刚学VB,有可能会有意想不到的问题,如果你发现有什么问题记得告诉我.我的Email;dengchongguang@avl.com.cn

出0入0汤圆

发表于 2005-1-17 15:59:48 | 显示全部楼层
真牛!

出0入0汤圆

发表于 2005-7-15 14:13:52 | 显示全部楼层
向你学习!

出0入296汤圆

发表于 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编辑过

出0入296汤圆

发表于 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编辑过
头像被屏蔽

出0入0汤圆

发表于 2005-7-16 08:52:01 | 显示全部楼层
好。谢谢。

出0入4汤圆

发表于 2005-7-16 10:01:54 | 显示全部楼层
牛人

出0入0汤圆

 楼主| 发表于 2005-7-17 12:51:56 | 显示全部楼层
用串口类有什么好处?

出0入296汤圆

发表于 2005-7-17 21:37:11 | 显示全部楼层
好处就是,可以重复利用,不用每一次都写一样的代码,而其封装过了,代码的可靠性好一点……其他没有什么,只是一个个人习惯,你完全可以把这些写道模块里面去。

以下为个人观点:

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

出0入0汤圆

发表于 2005-10-16 15:24:46 | 显示全部楼层
搂主:



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

出0入0汤圆

发表于 2005-10-16 16:12:44 | 显示全部楼层
点击此处打开armok0178526.pdf





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

出0入0汤圆

发表于 2005-10-16 16:49:21 | 显示全部楼层
请教一下楼主,我在VB里面找不到MSCOMM控件是不是板本问题,你用的是那个板本啊?

出0入0汤圆

 楼主| 发表于 2005-10-16 17:35:29 | 显示全部楼层
TO:liushilei1234

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



to:TKD2002

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

出0入0汤圆

发表于 2005-10-16 22:58:36 | 显示全部楼层
请教一下:







我看到程序中OSCCAL=0Xa0;





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



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

出0入0汤圆

 楼主| 发表于 2005-10-17 10:24:32 | 显示全部楼层
它的作用就是AVR芯片在生产的过程中内部RC振荡器的电阻阻值、电容容值会有偏差。

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

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



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

1.点菜单“Command”



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



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

出0入0汤圆

发表于 2005-11-3 13:38:27 | 显示全部楼层
UBRRL=(fosc/16/(baud+1))%256;

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

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

可datasheet上是

UBRR=(fosc/16/buad-1)

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

出0入0汤圆

发表于 2005-11-3 20:19:16 | 显示全部楼层
终于好了,我是按datasheet上作的,用的6m晶体,在2400是可能误差太大,不行,设成9600

就好了。

出0入0汤圆

发表于 2005-11-8 19:11:29 | 显示全部楼层
请问下位机接收的数据不用校验吗????一定能保证接收数据正确???小弟是菜鸟,不对的地方请多指教!!

出0入0汤圆

发表于 2005-11-8 22:55:54 | 显示全部楼层
顶一下

出0入0汤圆

 楼主| 发表于 2005-11-9 11:31:22 | 显示全部楼层
用校验当然好一点.

出0入0汤圆

发表于 2005-12-27 16:50:13 | 显示全部楼层


点击此处下载armok0194410.rar



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

出0入0汤圆

发表于 2006-1-6 14:36:59 | 显示全部楼层
想问一下dengchongguang

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

出0入0汤圆

发表于 2006-1-9 09:00:45 | 显示全部楼层
怎么没人回复一下,告之一下

出0入0汤圆

发表于 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?

出0入0汤圆

发表于 2006-1-15 15:57:40 | 显示全部楼层
我用VB写了一个串口多机通讯轮训的上位机程序,回头整理整理发上来

出0入0汤圆

发表于 2006-1-24 15:07:34 | 显示全部楼层
不错,我以前学VB时也做了一个简单的,不过现在不知放那里去啦,一起努力哈

出0入0汤圆

发表于 2006-2-7 15:06:05 | 显示全部楼层
谢谢这么多热心的高手大虾

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

发表于 2006-3-8 12:55:44 | 显示全部楼层
没学过VB,拿了楼主的程序花了点时间搞了一下,弄成一个给DS1302时钟校时的程序,还可以回显单片机发回的消息。

楼上的程序改一下看看,

dim instring as string

instring=MSComm1.input

text1.text=instring

出0入0汤圆

发表于 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

出0入0汤圆

发表于 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

出0入0汤圆

发表于 2006-3-9 14:10:25 | 显示全部楼层
楼上的程序也不可靠



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

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

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

出0入0汤圆

发表于 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;

                }

        }

}

出0入0汤圆

发表于 2006-3-10 10:50:50 | 显示全部楼层
还有,下图是我的熔丝位配置,不知是不是这里的问题?

出0入0汤圆

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

出0入0汤圆

发表于 2006-3-11 11:09:15 | 显示全部楼层
我把电路重新焊了一遍,终于可以调通了,看来还是我不小心焊接出了问题哈,谢谢各位了!

出0入0汤圆

发表于 2006-3-21 10:10:46 | 显示全部楼层
楼主正是牛!我也想用VB编串口通讯!我先看看吧,不会了还要向你请教哦!

出0入0汤圆

发表于 2006-10-7 10:48:58 | 显示全部楼层
VB中的MSComm控件怎么加进来啊 工程-部件里怎么没有的啊 ?

出0入0汤圆

发表于 2006-10-7 12:54:16 | 显示全部楼层
我现在学VC,要是有VC的例子就好了,不过还是谢谢以上各位!

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



http://www.gjwtech.com/

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

出0入0汤圆

发表于 2006-10-7 23:41:24 | 显示全部楼层
好啊,我原来使用MSComm_OnComm事件,数据一多超过8或9个以上就老丢。回头试试楼主的程序看看。

出0入0汤圆

发表于 2006-11-21 11:48:22 | 显示全部楼层
#include <iom64v.h>

#define UDRE 5

#define RXC  7

#define RXEN 4

#define TXEN  3



/*                  端口初始化函数                  */

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;

                }

        }

}





没调通 哪的问题?

出0入4汤圆

发表于 2006-11-21 12:53:27 | 显示全部楼层
hotpower 菜农是个好老师啊……

懂得学技术的真谛

看一百遍,不如一练

出0入0汤圆

发表于 2007-9-26 18:26:40 | 显示全部楼层
这个帖子怎么已经沉了这么长时间了,顶起来!

出0入0汤圆

发表于 2007-12-5 14:29:58 | 显示全部楼层

出0入0汤圆

发表于 2007-12-6 01:49:47 | 显示全部楼层
顶下

出0入0汤圆

发表于 2008-3-8 11:53:29 | 显示全部楼层
大家好!我这里有法拉电容,免费发放,感兴趣的朋友电邮:5000322@163.com

出0入0汤圆

发表于 2008-9-11 09:18:25 | 显示全部楼层
学习中,多谢各位

出0入0汤圆

发表于 2009-2-19 13:07:38 | 显示全部楼层
软件界面有点难看

出0入0汤圆

发表于 2009-3-23 20:21:05 | 显示全部楼层
在此我看到人性的光辉,无私奉献上下求索的精神

向各位学习,向各位致敬

出0入0汤圆

发表于 2009-3-23 23:00:24 | 显示全部楼层
东西很不错。  继续学习!!

出0入0汤圆

发表于 2009-4-30 13:49:51 | 显示全部楼层
楼主是好人好贴.

出0入0汤圆

发表于 2009-5-1 12:41:54 | 显示全部楼层
学习了,谢谢楼主

出0入0汤圆

发表于 2009-8-23 22:21:03 | 显示全部楼层
顶一下

出0入0汤圆

发表于 2010-7-6 15:05:34 | 显示全部楼层
学习

出0入0汤圆

发表于 2010-7-21 17:20:36 | 显示全部楼层
能不能来个51版的啊……手上没avr的片子,也没学过avr………………

出0入0汤圆

发表于 2010-8-13 11:39:14 | 显示全部楼层
留个记号,顶!

出0入0汤圆

发表于 2010-8-13 11:45:20 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-8-13 12:58:43 | 显示全部楼层
学习了

出0入0汤圆

发表于 2010-8-20 02:37:09 | 显示全部楼层
GOOD

出0入0汤圆

发表于 2010-10-20 20:53:53 | 显示全部楼层
mark,3q

出0入0汤圆

发表于 2010-10-20 22:17:16 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-9 23:32:33 | 显示全部楼层
万能论坛啊vb也有例子

出0入0汤圆

发表于 2010-11-10 00:48:40 | 显示全部楼层
用串口调试程序很方便

出0入0汤圆

发表于 2010-11-20 13:28:12 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-20 14:55:41 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-20 22:11:48 | 显示全部楼层
vb学习中

出0入0汤圆

发表于 2010-12-29 22:12:27 | 显示全部楼层
跟我刚做的有点像,我改用usb转串口的!

出0入16汤圆

发表于 2010-12-30 08:10:19 | 显示全部楼层
mark

出0入25汤圆

发表于 2011-4-21 12:07:00 | 显示全部楼层
Mark

出0入0汤圆

发表于 2011-4-21 22:53:30 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-4-22 11:56:52 | 显示全部楼层
向各位大侠学习 mark

出0入0汤圆

发表于 2011-4-22 13:26:30 | 显示全部楼层
用EXCEL 的vba也可以做串口通信,我做了一个例子,找一下传上来大家看看。挺好玩的,excel直接读取操作串口。哈哈。

出0入0汤圆

发表于 2011-7-22 16:51:07 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-22 22:56:37 | 显示全部楼层
回复【87楼】lovefei
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2012-7-14 10:34:42 | 显示全部楼层
yu_jun_feng 发表于 2005-12-27 16:50
点击此处下载armok0194410.rar



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

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-7-15 23:57:51 | 显示全部楼层
vb好搞还是vc好搞?我的老师说vc不难,我的学长都搞vb来编上位机······

出0入0汤圆

发表于 2012-9-24 11:35:55 | 显示全部楼层
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-7 23:49

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表