佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 19094|回复: 105

电脑串行端口(serial port) 和单晶片通讯

  [复制链接]
发表于 7-8-2009 10:35 PM | 显示全部楼层 |阅读模式
很多时候microcontroller需要和电脑交换讯息。
如何和电脑交换讯息呢? 就是通过电脑的端口。 也就是port.
可以是serial port,  usb, ethernet等。 当然,motherboard上的pci slot也是可以的。 如果microcontroller能够handle到的话。
不过最简单的方法是用serial port. uart在一个microcontroller是属于很普通的peripheral.
而usb ethernet等需要比较high end的mcu才有。

当然如果要用serial port和microcontroller 通讯, 首先你需要知道如何写电脑program来控制serial port.
在这里我用的是visual basic express 2008来编写电脑程序
vb2008 express是免费下载, 使用的。
http://www.microsoft.com/express/vb/Default.aspx

*我不是一个职业programmer,会的都是以前和senior学的, 再加上自修得到的结果。有任何错误可以直接点出来, 以免我误人子弟。

评分

参与人数 1积分 +101 收起 理由
pic + 101 原创教学。

查看全部评分

回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 7-8-2009 11:22 PM | 显示全部楼层

简单loopback程序

先从简单的loopback 程序开始。

这个是这个贴的example program可以下载, 自行修改
http://www.mediafire.com/download.php?qzzin10tcdv

loopback就是你send什么, 你就收到什么。 要如何做loopback呢?
很简单, serial port pin2是data receive, pin3是data transmit.
把这两个pin short起来, 你传送什么, 你就收到什么。

电脑编程方面:
一开始create new project.
用的是windows forms application.





过后应该会看到这个。一开始你只会有一个form,里面什么都没有。 留给你自己设计。
toolbox default会auto hide在左边。 你会看到toolbox button. click一下就出来了。
过后file -> save all. 这个应该没问题。 不加以说明。




首先create一个简单的GUI interface,左边的toolbox是一些program通常用的component.比如说textbox, button, label, serial port等。而右下角的是properties box.这个拿来setting component properties.
不一样的component的properties不一样。
好, 这个gui只有几个component.
两个group box.两个textbox,两个button.一个serial port.
你会看到serial port被place在下方。 这是由于这个serial port不属于gui的一部分。
group box在properties-> text, 你可以修改它的caption.在我的case 为 "Send"
button, 同样的修改properties->text你就可以修改它的button text.
还有你会看到一个properties 为 (name), 每个component name都不一样。
在我的case:
Send的name为 "ButtonSend"
Receive的为 "ButtonRcv"
上方的text box 为 "TextBoxSend"
下方的text box为 "TextBoxRcv"
name 是很重要的, 在coding的时候你会用到。

好了,interface搞定。
现在关于serial port.当你add过后, 就会出现在form的下面。
来setting一些properties.
name: SerialPort1 ->名字而已, 爽你可以改
baudrate 9600.      ->以后会用到, loopback不用
DataBits:8              ->大多数的情况都用这个
ComName: COM1 ->看你要用哪一个serial port.
在loopback 里, baudrate, databits都不重要 。
最重要是com port.看你用什么com port来做loopback.在我的case,我用COM1



好了, 现在进入coding part.
在你还没有开始用serial port之前, 你必须要open serial port.
double click 整个form.这时候你直接进入code editor.同时间vb会自动有class template和一个form_load function.
form_load就是当你一开始运行你的form(在这个时候, 开始form就是开始program)的时候, 你要做什么。
这里, 当然是open serial port.
加入这行代码:
  1. SerialPort1.Open()
复制代码
serialport1就是刚才serial port component的(name) properties.
好了这样一开始program,你就会open serial port 了。
open 哪一个port ?也就是刚才你在properties portname 那边set的那个port.


接下来, 我要send data.我要直接把send button上面那个textbox里面的string send出去。
double click ButtonSend.
这时候, 另一个private sub会自动出来, 也就是->ButtonSend_Click
加入这行代码
  1. SerialPort1.Write(TextBoxSend.Text)
复制代码
在接下来, 我要receive serial port data.然后display出来, 就display在ButtonRcv上面的那个textbox.
同样的double click ButtonRcv, 你会有另一个private sub ->ButtonRcv_Click
加入这行代码。
  1. TextBoxRcv.Text = SerialPort1.ReadExisting
复制代码
大功告成。。。。。也就这样。
你会看到大概这样的冬冬



然后可以开始测试了。 记得把你的serial port pin2和pin3 short起来。。。。。
电脑的comport是 male的, 要short很麻烦
我的做法是把一条db9 female to female cable extension的一段接到serial portm,然后另一端用电线short pin2, pin3.

测试结果:
我发送“testing123 chinese.cari.com.my“按Send
然后按Receive,我拿到同样的冬冬。


[ 本帖最后由 fritlizt 于 7-8-2009 11:32 PM 编辑 ]
回复

使用道具 举报

发表于 8-8-2009 05:38 AM | 显示全部楼层
这是DIY application 吗?好酷哦!!!
回复

使用道具 举报

发表于 8-8-2009 10:05 AM | 显示全部楼层
可以参考 msdn library .net framework  System.IO.Ports namespace, Serial Port Class, Serial Port Method
使用serial port, 记得要open port , 用完了就close port.
如果给mcu, 应该只有接rx tx, 所以记得disable flow control.
一开始可以用 GetPortNames() 来获取电脑所有的serial port name,  然后list 出来。 方便选择
回复

使用道具 举报

 楼主| 发表于 8-8-2009 11:32 PM | 显示全部楼层
原帖由 Blackeyez 于 8-8-2009 05:38 AM 发表
这是DIY application 吗?好酷哦!!!


对。。。。暂时是loopback.
迟一点会讲到involve pc<->mcu的communication.
回复

使用道具 举报

 楼主| 发表于 8-8-2009 11:33 PM | 显示全部楼层
原帖由 chan1314 于 8-8-2009 10:05 AM 发表
可以参考 msdn library .net framework  System.IO.Ports namespace, Serial Port Class, Serial Port Method
使用serial port, 记得要open port , 用完了就close port.
如果给mcu, 应该只有接rx tx, 所以记得di ...


对。。。迟一点会在补充。暂时先这样。 很累得说。。。。。
回复

使用道具 举报

Follow Us
发表于 16-8-2009 06:55 PM | 显示全部楼层
原帖由 fritlizt 于 8-8-2009 11:32 PM 发表


对。。。。暂时是loopback.
迟一点会讲到involve pcmcu的communication.


期待着pc mcu 的communication
嘿嘿
回复

使用道具 举报

发表于 28-8-2009 05:30 PM | 显示全部楼层
原帖由 fritlizt 于 8-8-2009 11:32 PM 发表


对。。。。暂时是loopback.
迟一点会讲到involve pcmcu的communication.


我最近也在研究用visual basic来写一个程序让PC和MCU沟通,期待版主的分享。
回复

使用道具 举报


ADVERTISEMENT

发表于 9-9-2009 03:45 AM | 显示全部楼层
现在在赶着类似的project。
以下是我写来test mcu 的code,大家看看对吗?谢谢。
我是想让mcu会从RxD收1byte data,然后从TxD发送1byte data。

ORG     0000H
MOV     TMOD,#20H
MOV     TCON,#00H
MOV     SCON,#50H
MOV     TH1,#0xecH
SETB    TR1
Again:  CLR     RI
MOV     A,SBUF
JNB     RI,$
CLR     TI
MOV     SBUF,A
JNB     TI,$
SJMP Again
END

[ 本帖最后由 ~Lucifer~ 于 9-9-2009 08:53 AM 编辑 ]
回复

使用道具 举报

发表于 9-9-2009 03:53 AM | 显示全部楼层
另外一个问题,如果我已经接好rs232和mcu和pc的connection,那么hyperterminal的baud rate要不要和mcu的一样?
flow control要放什么?None?
谢谢
回复

使用道具 举报

 楼主| 发表于 9-9-2009 08:06 AM | 显示全部楼层
原帖由 ~Lucifer~ 于 9-9-2009 03:45 AM 发表
现在在赶着类似的project。
以下是我写来test mcu 的code,大家看看对吗?谢谢。
我是想让mcu会从RxD收1byte data,然后从TxD发送1byte data。

ORG     0000H
MOV     TMOD,#20H    ;timer 1,mod ...

另外一个问题,如果我已经接好rs232和mcu和pc的connection,那么hyperterminal的baud rate要不要和mcu的一样?
flow control要放什么?None?
谢谢


用什么mcu?
mmu生几年级啊?如果是gamma year 1st sem问这个问题, 还情有可原。。。。如果是final year...

baudrate当然要一样, flow control none.
回复

使用道具 举报

发表于 9-9-2009 08:55 AM | 显示全部楼层
原帖由 fritlizt 于 9-9-2009 08:06 AM 发表




用什么mcu?
mmu生几年级啊?如果是gamma year 1st sem问这个问题, 还情有可原。。。。如果是final year...

baudrate当然要一样, flow control none.


不好意思,delta year 1st sem==,刚刚发觉问了很不应该问的问题。
用at89c51ed2,用电脑就可以program了。总觉得很不稳定
回复

使用道具 举报

 楼主| 发表于 9-9-2009 10:36 PM | 显示全部楼层
ORG     0000H
MOV     TMOD,#20H
MOV     TCON,#00H
MOV     SCON,#50H
MOV     TH1,#0xecH
SETB    TR1
Again:  CLR     RI
MOV     A,SBUF
JNB     RI,$
CLR     TI
MOV     SBUF,A
JNB     TI,$
SJMP Again
END


还好拉, delta 1st sem.
由于资料不足, 我假设你是variable baudrate using timer1.
我再假设你没有X2 clock mode.
另外假设你的crystal = 11.0592MHz.

setting是没错的。不过一开始TI 应该是1, 0 = busy. 所以scon = 0x52.
tcon = 0x00是没错的, 虽然有点多余。。
th1,我不懂你的baudrate,懒惰假设,也懒惰算,应该没问题。

CLR     RI
MOV     A,SBUF
JNB     RI,$
咚咚是对的,不过次序错了。
你应该等RI set才读data.

CLR     TI
MOV     SBUF,A
JNB     TI,$
看起来没错。

你好像改过program了。
之前好像没有sjmp.
回复

使用道具 举报

 楼主| 发表于 9-9-2009 10:38 PM | 显示全部楼层
原帖由 ~Lucifer~ 于 9-9-2009 08:55 AM 发表


不好意思,delta year 1st sem==,刚刚发觉问了很不应该问的问题。
用at89c51ed2,用电脑就可以program了。总觉得很不稳定


你是指isp吗?
没什么不一样。
isp在mcu 很普通。pic, 8051很多都有。
我用了这样久没什么问题过。 除非flash write/erase超过limit了。
回复

使用道具 举报

发表于 9-9-2009 11:06 PM | 显示全部楼层
原帖由 fritlizt 于 9-9-2009 10:36 PM 发表


还好拉, delta 1st sem.
由于资料不足, 我假设你是variable baudrate using timer1.
我再假设你没有X2 clock mode.
另外假设你的crystal = 11.0592MHz.

setting是没错的。不过一开始TI 应该是1, 0 = bus ...


谢谢指教,用hyper terminal test过了,可以跑。
是的,改过code了用sjmp,因为如果用hyper terminal test的话可以打多个character。
你以前是mmu生吗?什么course?我是tele的

[ 本帖最后由 ~Lucifer~ 于 9-9-2009 11:14 PM 编辑 ]
回复

使用道具 举报

发表于 10-9-2009 05:38 AM | 显示全部楼层
lz是mmu robotic的senior吗?我的mini project用的是vb6,有机会再试试vb2008~
回复

使用道具 举报


ADVERTISEMENT

发表于 26-1-2010 10:55 PM | 显示全部楼层
我是拉曼生y4s1,从来都没有用过visual basic.请问fritlizt 我能不能把textbox所打的信息分成单一字母然后再把字母送去IC.是不是要用到array???
回复

使用道具 举报

发表于 27-1-2010 09:30 AM | 显示全部楼层
请问fritlizt如果利用您教导的例子做少许的更改把textbox所打的信息分成单一字母然后再把字母的coding 是不是这样?
Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        SerialPort1.Open()
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonSend.Click
        Dim Word() As String
        ReDim Word(Len(TextBoxSend.Text))

        'fill the array
        For i = 1 To Len(TextBoxSend.Text)
            Word(i) = Mid(TextBoxSend.Text, i, 1)
            SerialPort1.Write(Word(i))
        Next


    End Sub

    Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBoxSend.TextChanged

    End Sub

    Private Sub ButtonRcv_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonRcv.Click
        TextBoxRcv.Text = SerialPort1.ReadExisting
    End Sub
End Class
回复

使用道具 举报

发表于 25-2-2010 12:43 AM | 显示全部楼层
请 问使用 usb to RS232 converter 是否可行? 89s52
回复

使用道具 举报

 楼主| 发表于 5-3-2010 03:37 PM | 显示全部楼层
回复 19# xkore


   

可以。 没问题的。
com port对就可以了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 19-4-2024 06:21 PM , Processed in 0.078438 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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