查看: 19146|回复: 105
|
电脑串行端口(serial port) 和单晶片通讯
[复制链接]
|
|
很多时候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学的, 再加上自修得到的结果。有任何错误可以直接点出来, 以免我误人子弟。 |
评分
-
查看全部评分
|
|
|
|
|
|
|
楼主 |
发表于 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.
加入这行代码: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
加入这行代码- SerialPort1.Write(TextBoxSend.Text)
复制代码 在接下来, 我要receive serial port data.然后display出来, 就display在ButtonRcv上面的那个textbox.
同样的double click ButtonRcv, 你会有另一个private sub ->ButtonRcv_Click
加入这行代码。- 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
|
显示全部楼层
|
|
|
|
|
|
|
发表于 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沟通,期待版主的分享。 |
|
|
|
|
|
|
|
发表于 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
|
显示全部楼层
|
|
|
|
|
|
|
发表于 9-9-2009 08:55 AM
|
显示全部楼层
|
|
|
|
|
|
|
楼主 |
发表于 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~ |
|
|
|
|
|
|
|
发表于 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对就可以了。 |
|
|
|
|
|
|
| |
本周最热论坛帖子
|