虽然以太网接口和USB接口也是以一个串行流进行数据传送的,但是串口连接通常特指那些与RS-232标准兼容的硬件或者调制解调器的接口。废话少讲,今天来解剖使用串口时的编程代码细节。
先来一段代码压压惊:
上面的代码是使用串口的第一步,来解释下都是啥意思。来瞧瞧:
第21-22行,定义了一个用来配置串口属性的结构体:
struct termios serial; bzero(&serial, sizeof(serial));
第24行,将串口设置为raw数据模式,即关闭掉字符回显、关闭输入输出时特殊的进度控制特殊字符,因为我们此时不需要使用串口来实现终端控制,因此这些功能都不需要:
cfmakeraw(&serial);
第25-26行,很简单,设置输入输出波特率。
cfsetispeed(&serial, B9600); cfsetospeed(&serial, B9600);
第28-32行,设置串口控制属性(c_cflag),其中:
serial.c_cflag |= CLOCAL | CREAD; // 忽略调制解调器线路状态并使能接收器 serial.c_cflag &= ~CSIZE; // 使能字符尺寸 serial.c_cflag |= CS8; // 设置字符尺寸为CS8 serial.c_cflag &= ~PARENB; // 关闭奇偶校验 serial.c_cflag &= ~CSTOPB; // 关闭停止位
第33、36行,刷新掉接收到的数据并忽略掉他们:
tcflush(fd,TCIFLUSH);
第34-35行,设置非规范模式下的超时时长和最小字符数:
serial.c_cc[VTIME] = 10; serial.c_cc[VMIN] = 1;
最后,将以上所有参数一股脑设置到对应的串口就行了:
tcsetattr(fd,TCSANOW,&serial);
当然,上面的 fd 就是系统中的某一个你想要设置的成上面那样的属性参数的串口,比如就拿粤嵌GEC210开发板来说,他有四个串口,其中第一个就已经被用于终端控制了,那我们可以打开第二个串口来设置:
int fd = open(“/dev/s3c2410_serial1”, O_RDWR | O_NOCTTY);
好了,今天就扯到这里,这几天都是代码的玩意儿,比较专业比较枯燥比较蒙圈,能看完的绝对都是真爱!成功的路上没有那么多舒服可言,就像粤嵌任老师说的,舒服都是留给死人的!