一.串口简介以及如何利用串口编程:
1.什么是串口:
串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用。常用的串口是 RS-232-C 接口(又称 EIA RS-232-C)它是在 1970 年由美国电子工业协会(EIA)联合贝尔系统、 调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的全名是数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准该标准规定采用一个 25 个脚的 DB25 连接器,对连接器的每个引脚的信号内容加以规定,还对各种信号的电平加以规定。传输距离在码元畸变小于 4% 的情况下,传输电缆长度应为 50 英尺。
2.如何在linux平台下打开串口
在Linux下串口文件是位于/dev下的:
串口一为/dev/ttyS0
串口二为/dev/ttyS1
打开串口是通过使用标准的文件打开函数操作:
3.linux下如何设置串口的参数
最基本的设置串口包括波特率设置,效验位和停止位设置,串口的设置主要是设置struct termios结构体的各成员值:
设置这个结构体很复杂,我这里就只说说常见的一些设置:
波特率设置,下面是修改波特率的代码:
4.举一个例子
下面是一个简单的读取串口数据的例子,使用了上面定义的一些函数和头文件
代码:
#include /*标准输入输出定义*/
#include /*标准函数库定义*/
#include /*Unix标准函数定义*/
#include /**/
#include /**/
#include /*文件控制定义*/
#include /*PPSIX终端控制定义*/
#include /*错误号定义*/
/***@brief 设置串口通信速率
*@param fd 类型 int 打开串口的文件句柄
*@param speed 类型 int 串口速度
*@return void*/
int speed_arr[] = { B38400, B19200, B9600, B4800, B2400, B1200, B300,
B38400, B19200, B9600, B4800, B2400, B1200, B300, };
int name_arr[] = {38400, 19200, 9600, 4800, 2400, 1200, 300,
38400, 19200, 9600, 4800, 2400, 1200, 300, };
void set_speed(int fd, int speed)
{
int i;
int status;
struct termios Opt;
tcgetattr(fd, &Opt);
for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++)
{
if (speed == name_arr[i])
{
tcflush(fd, TCIOFLUSH);
cfsetispeed(&Opt, speed_arr[i]);
cfsetospeed(&Opt, speed_arr[i]);
status = tcsetattr(fd, TCSANOW, &Opt);
if (status != 0)
perror(tcsetattr fd1);
return;
}
tcflush(fd,TCIOFLUSH);
}
}
/**
*@brief 设置串口数据位,停止位和效验位
*@param fd 类型 int 打开的串口文件句柄*
*@param databits 类型 int 数据位 取值 为 7 或者8*
*@param stopbits 类型 int 停止位 取值为 1 或者2*
*@param parity 类型 int 效验类型 取值为N,E,O,,S
*/
int set_Parity(int fd,int databits,int stopbits,int parity)
{
struct termios options;
if ( tcgetattr( fd,&options) != 0)
{
perror(SetupSerial 1);
return(FALSE);
}
options.c_cflag &= ~CSIZE;
switch (databits) /*设置数据位数*/
{
case 7:
options.c_cflag |= CS7;
break;
case 8:
options.c_cflag |= CS8;
break;
default:
fprintf(stderr,Unsupported data size\n);
return (FALSE);
}
switch (parity)
{
case n:
case N:
options.c_cflag &= ~PARENB; /* Clear parity enable */
options.c_iflag &= ~INPCK; /* Enable parity checking */
break;
case o:
case O:
options.c_cflag |= (PARODD | PARENB); /* 设置为奇效验*/
options.c_iflag |= INPCK; /* Disnable parity checking */
break;
case e:
case E:
options.c_cflag |= PARENB; /* Enable parity */
options.c_cflag &= ~PARODD; /* 转换为偶效验*/
options.c_iflag |= INPCK; /* Disnable parity checking */
break;
case S:
case s: /*as no parity*/
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
break;
default:
fprintf(stderr,Unsupported parity\n);
return (FALSE);
}
/* 设置停止位*/
switch (stopbits)
{
case 1:
options.c_cflag &= ~CSTOPB;
break;
case 2:
options.c_cflag |= CSTOPB;
break;
default:
fprintf(stderr,Unsupported stop bits\n);
return (FALSE);
}
/* Set input parity option */
if (parity != n)
options.c_iflag |= INPCK;
options.c_cc[VTIME] = 150; // 15 seconds
options.c_cc[VMIN] = 0;
tcflush(fd,TCIFLUSH); /* Update the options and do it NOW */
if (tcsetattr(fd,TCSANOW,&options) != 0)
{
perror(SetupSerial 3);
return (FALSE);
}
return (TRUE);
}
/**
*@breif 打开串口
*/
int OpenDev(char *Dev)
{
int fd = open( Dev, O_RDWR ); //| O_NOCTTY | O_NDELAY
if (-1 == fd)
{ /*设置数据位数*/
perror(Cant Open Serial Port);
return -1;
}
else
return fd;
}
/**
*@breif main()
*/
int main(int argc, char **argv)
{
int fd;
int nread;
char buff[512];
/* 打开串口
* 在 Linux 下串口文件是位于 /dev 下的
* 串口一为/dev/ttyS0,串口二为/dev/ttyS1
*/
char *dev =/dev/ttyS1;
/* 打开串口是通过使用标准的文件打开函数操作:
*/
fd = OpenDev(dev);
if (fd>0)
set_speed(fd,19200);
else
{
printf(Cant Open Serial Port!\n);
exit(0);
}
if (set_Parity(fd,8,1,N)== FALSE)
{
printf(Set Parity Error\n);
exit(1);
}
while(1)
{
while((nread = read(fd,buff,512))>0)
{
printf(\nLen %d\n,nread);
buff[nread+1]=\ 0;
printf(\n%s,buff);
}
}
//close(fd);
//exit(0);
}
完整源代码点击此处下载armjishu_main.c (文件大小:4K)
需要注意的是:
如果不是开发终端之类的,只是串口传输数据,而不需要串口来处理,那么使用原始模式(Raw Mode)方式来通讯,设置方式如下:
下载后,可直接编译并运行
.串口线电子制作:
在电脑的使用中往往会遇到各种各样的连接线。这些连接线外观上好像都差不多,但内部结构完全不同并且不能混用。如果在使用中这些连接线坏了,往往很多使用者都不知道应该怎么办,下面就给出这些常见的连接线的连线方法以便于修理或查找故障。在介绍之前先对一些市场常用名词做出解释。现在所有的接头都可以分为公头和母头两大类:
公头:泛指所有针式的接头。
母头:泛指所有插槽式的接头。
所有接头的针脚有统一规定,在接头上都印好了的,连接时要注意查看,在接线时没有提及的针脚都悬空不管,下面给出串口,并口各针脚功能表以供高级用户维护电缆或接头时使用:
--------25针串口功能一览
针脚 功能
2 发送数据(TXD)
3 接收数据 (RXD)
4 发送请求 (RTS)
5 发送清除 (CTS)
6 数据准备好 (DSR)
7 信号地 (GND)
8 载波检测 (DCD)
20 数据终端准备好 (DTR)
22 振铃指示 (RI)
--------9针串口功能一览表
针脚 功能
1 载波检测 (DCD)
2 接收数据 (RXD)
3 发送数据(TXD)
4 数据终端准备好 (DTR)
5 信号地 (GND)
6 数据准备好 (DSR)
7 发送请求 (RTS)
8 发送清除 (CTS)
9 振铃指示 (RI)
3. 串口联机线的连接方法
串口联机线主要用于直接把两台电脑的com口连接。比较早一点的AT架构的电脑的串口有为9针,和25针两种,现在的ATX架构的电脑两个串口全部是9针。于是联机线就分为3种(9针对9针串口联机线,9针对25针串口联机线,25针对25针串口联机线)这些直接电缆连接线可以互换的连线方法如下表:
--------9针对9针串口连接
9针公头 9针母头
2 —— 3
3 —— 2
4 —— 6
5 —— 5
6 —— 4
7 —— 8
8 —— 7
--------25针对25针串口连接
25针公头 25针母头
2 —— 3
3 —— 2
4 —— 5
5 —— 4
6 —— 20
7 —— 7
20 —— 6
--------9针对25针串口连接
9针公头 25针母头
2 —— 2
3 —— 3
4 —— 6
5 —— 7
6 —— 20
7 —— 5
8 —— 4
4.串口转接线
这种转接线适用于9针串口和25针串口的转换。
首先,根据需要(9转25或25转9)选择两个转接头。选择方法如下:
9针转25针(9针公头,25针母头)。25针转9针(25针公头,9针母头)。然后使用尽量短的带屏蔽的多芯连接线。连接方法如下表
--------9针公头 25针接头
1 —— 8
2 —— 3
3 —— 2
4 —— 20
5 —— 7
6 —— 6
7 —— 4
8 —— 5
9 —— 22