串口开发-入门篇
作者:SUDT Studio
演示代码:
ComTest1 - 9 Kb
前言:串口开发的文章网上有很多,侧重点互不相同各有所长,但是对于一个初学串口开发的新手来说,这些文章还有很多不足的地方,所以决定写一些东西,力求简单、通俗易懂,希望对初学者有所帮助。
基本概念
本文将会采用由简入深的方式对串口开发进行介绍,但是在步入正题前我们必须介绍接口技术的两个重要概念—上位机、下位机,因为这两个概念非常的重要。
上位机:也就是通信双方较为主动的一方,也称为主机,可以是两台电脑中的其中一台,可以是两台设备间的其中一台,也可以电脑与设备间的其中一台,关键是看哪一方处于比较主动的位置。一般情况下是指电脑。
下位机:是通信双方相比而言处于较为被动的一方,一般是指设备(例如单片机),也可以是某台电脑。
这两种称谓是相对的,区分的方式是确定主动方与被动方。
![](http://blog.csdn.net/images/blog_csdn_net/virginia/image001.jpg)
下面将抽取一对典型的通信实体(类型-2),开始介绍串口通信的原理以及开发实例。
实例介绍:
对于类型-2,也即是电脑对电脑的通信方式,暂不涉及过多的硬件知识利于初学者入门。
电脑对电脑的串行连接一般使用串口数据线作为通信载体,串口数据线可以到市场购买也可以自制。对于一些初学者来说,刚开始并没有作好这方面的准备,不过没有关系,下面将分别介绍在没有以及拥有串口数据线的情况下如何进行串口方面的开发试验。
- 没有串口数据线的情况;
- 有串口数据线,但是只有一台拥有两个串口的电脑。
开发环境的准备:
本文采用VC++ 6.0作为开发环境,以后会增加VB、Dephi、C++ Builder等环境下的实例。操作系统为window 2000/XP/2003。
串口操作的原理:
对串口的整个操作过程一般分为四个步骤:
1.
打开串口;
2.
设置串口参数;
3.
读、写数据;
4.
关闭串口。
所以,我们的开发也将围绕这几个步骤进行。
实践:
1.
没有串口数据线的情况:
在这种情况下我们可以进行往串口写入数据的试验,利用串口监控工具验证数据是否真实的写入指定串口。
启动VC++ 6.0,新建一个window32 控制台类型的工程,名称为ComTest1
![](http://blog.csdn.net/images/blog_csdn_net/virginia/image002.jpg)
确定之后进入第二个步骤:
![](http://blog.csdn.net/images/blog_csdn_net/virginia/image004.jpg)
选中第二项,然后结束,此时我们就创建了一个名为ComTest1的工程,里面只有一个空的main函数。
接下来,我们将对串口进行四项操作,打开串口,设置串口参数,写入数据,关闭串口,代码如下:
#include
"stdafx.h"
#include
<stdio.h>
#include
<WINDOWS.H>
int
main
(
int
argc
,
char
*
argv
[])
{
//1.
打开指定串口
HANDLE
hComm
=
CreateFile
("COM1",
//
串口名称
(COMx)
GENERIC_READ
|
GENERIC_WRITE
,
//
串口属性为可读
/
写
0,
//
串口设备必须被独占性的访问
NULL
,
//
无安全属性
OPEN_EXISTING
,
//
串口设备必须使用
OPEN_EXISTING
参数
FILE_ATTRIBUTE_NORMAL
,
//
同步式
I/O
0);
//
对于串口设备而言此参数必须为
0
if
(
hComm
==
INVALID_HANDLE_VALUE
)
{
//
如果该串口不存在或者正被另外一个应用程序使用,
//
则打开失败,本程序退出
return
FALSE
;
}
//2.
设置串口参数:波特率、数据位、校验位、停止位等信息
DCB
dcb
;
GetCommState
(
hComm
, &
dcb
);
//
获取该端口的默认参数
//
修改波特率
dcb
.
BaudRate
= 115200;
//
重新设置参数
SetCommState
(
hComm
, &
dcb
);
//3.
往串口写数据
char
lpBuffer
[] = "Hello world!";
//
将要写入的数据
DWORD
nNumberOfBytesToWrite
=
strlen
(
lpBuffer
);
//
将要写入的数据长度
DWORD
nBytesSent
;
//
实际写入的数据长度
WriteFile
(
hComm
,
lpBuffer
,
nNumberOfBytesToWrite
, &
nBytesSent
,
NULL
);
//4.
关闭串口
CloseHandle
(
hComm
);
return
0;
}
接下来我们将验证字符串”Hello world!”是否已经写入串口com1。启动
AccessPort串口调试工具,选择Monitor模式,然后选择被监控的串口com1,开始监控;然后编译并运行我们的工程ComTest1,此时
AccessPort拦截到的信息如下:
![](http://blog.csdn.net/images/blog_csdn_net/virginia/image006.jpg)
Port Opened - ComTest1.exe
Baud Rate: 115200
StopBits: 1, Parity: No, DataBits: 8
Length: 0012, Data: Hello world!
Port Closed
Baud Rate: 115200
StopBits: 1, Parity: No, DataBits: 8
Length: 0012, Data: Hello world!
Port Closed
其中的信息与我们的工程ComTest1中的四个操作步骤一一对应,因此可以证明我们的第一个串口程序写入的数据是正确的。
2. 有串口数据线,但是只有一台拥有两个串口的电脑的情况
在这种情况下,我们将串口数据线把电脑的COM1与COM2连接起来,启动
AccessPort并选择Terminal模式,设置COM2口的波特率为115200,无校验位、8个数据位、1个停止位,并打开该端口;然后运行我们的ComTest1工程,接下来我们会看到按照十六进制-字符串方式显示的数据,说明ComTest1运行正确,写入com1的数据被转发到了com2上,效果图如下:
![](http://blog.csdn.net/images/blog_csdn_net/virginia/image008.jpg)
这仅仅是证明我们的ComTest1写入成功,如果我们在源代码WriteFile函数之后加入如下代码,就可以接收到
AccessPort通过com2 发送到com1的数据:
//
读串口数据
char
lpReadBuf
[1024] = { 0 };
//
接收缓冲区长度为
1024
,内容都为
0
DWORD
nNumberOfBytesToRead
= 1024;
//
最大读取
1024
个字节
DWORD
nBytesRead
;
ReadFile
(
hComm
,
lpReadBuf
,
nNumberOfBytesToRead
, &
nBytesRead
,
NULL
);
printf
("Read Data: %s",
lpReadBuf
);
我们在ComTest1工程文件的
ReadFile
(
hComm
,
lpReadBuf
,
nNumberOfBytesToRead
, &
nBytesRead
,
NULL
);
以及
return 0;这两行按F9分别设置断点并编译运行,接下来在
AccessPort的数据发送区输入字符串Test并发送,然后继续运行ComTest1至return 0;这一行,最后我们会看到运行的结果如下:
![](http://blog.csdn.net/images/blog_csdn_net/virginia/image010.jpg)
这样我们就完成了一个最简单的可进行读、写操作的串口程序。通过上面的介绍,你会发现串口开发并不是什么难事。在我们接下来的系列文章中将会深入细致的介绍更多的内容。