linux下串口驱动测试程序

linux串口驱动测试程序 
2009-12-26 20:42:20|  分类: 技术标签: |字号大中小 订阅
【转载时请注明文章出处:hellottsky.blog.163
      为了测试串口驱动,我们需要用串口驱动测试程序先向串口写入数据,然后再从串口读出来,以证明串口驱动的正确性。下面我们来分析一下串口驱动测试程序的流程。
    1、串口程序需要的头文件 
#include <stdio.h> /*标准输入输出定义*/
#include <stdlib.h> /*标准函数库定义*/
#include <unistd.h> /*Unix 标准函数定义*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> /*锁时之盒文件控制定义*/
#include <termios.h> /*PPSIX 终端控制定义*/
#include <errno.h> /*错误号定义*/
    2、打开串口设备渗透汽化膜 fd = open( "/dev/ttyS0", O_RDWR); 我们以/dev/ttyS0即一般机子上的COM1为例。
    3设置串口设备:
串口设备的设置主要通过 struct termio的结构体来完成:
struct termio
{ unsigned short  c_iflag;        /* 输入模式标志 */
unsigned short  c_oflag;  /* 输出模式标志 */
unsigned short  c_cflag;  /* 控制模式标志*/
unsigned short  c_lflag;  /* 当前模式标志 */
unsigned char  c_line;          /* line discipline */
unsigned char  c_cc[NCC];              /* 控制字 */
};
我们用下面函数实现具体的串口设置:
int setup_port(int fd, int baud, int databits, int parity, int stopbits)
{
射频标签        struct termio term_attr;
        if (ioctl(fd, TCGETA, &term_attr) < 0) {    //fd所对应的终端信息存入termio结构,得到当前配置
                return -1;
        }
        memcpy(&oterm_attr, &term_attr, sizeof(struct termio));  //保持当前配置到oterm_attr,用于系统恢复
        term_attr.c_iflag &= ~(INLCR | IGNCR | ICRNL | ISTRIP);
        term_attr.c_oflag &= ~(OPOST | ONLCR | OCRNL);
        term_attr.c_lflag &= ~(ISIG | ECHO | ICANON | NOFLSH);
        term_attr.c_cflag &= ~CBAUD;
        term_attr.c_cflag |= CREAD | speed_to_flag(baud);    //设置波特率
                                                                                        //标志各种标志可选范围
       
        term_attr.c_cflag &= ~(CSIZE);  //设置数据位长度
        switch (databits) {
        case 5:
                term_attr.c_cflag |= CS5;      //设置数据位长度为5,下同
                break;

        case 6:
                term_attr.c_cflag |= CS6;
                break;

        case 7:
                term_attr.c_cflag |= CS7;
                break;

        case 8:
        default:
                term_attr.c_cflag |= CS8;
                break;
        }

        switch (parity) {                              //设置奇偶校验位
        case 1: 
玻璃纸包装                term_attr.c_cflag |= (PARENB | PARODD);    //奇校验
                break;

        case 2:
                term_attr.c_cflag |= PARENB;                            //偶校验
                term_attr.c_cflag &= ~(PARODD);
                break;

        case 0: 
        default:
                term_attr.c_cflag &= ~(PARENB);                    //不校验
                break;
        }


        switch (stopbits) {                                              //设置停止位
        case 2:                                                                //有停止位为两位,下同
                term_attr.c_cflag |= CSTOPB;
                break;

        case 1:
        default:
                term_attr.c_cflag &= ~CSTOPB;
                break;
        }

        term_attr.c_cc[VMIN] = 1;            //更新设置,并且立即完成
        term_attr.c_cc[VTIME] = 0;          //设置超时

        if (ioctl(fd, TCSETAW, &term_attr) < 0) {        //将更改后的属性加载到设备中
                return -1;
        }

        if (ioctl(fd, TCFLSH, 2) < 0) {                                  //将输入输出队列全部发出,清空串口中队列
                return -1;
        }

        return 0;pvc瑜伽垫
}
33ri 4、向串口写入数据:
                while ( (len = read(0, buf, MAX_BUF_SIZE)) > 0 ) {
                        if (len == 1) {                      //如果当前缓冲区为空,则写入停止位,发送
                                buf[0] = MY_END_CHAR;
                                buf[1] = 0;
                                write_data(fd, buf, len);
                                break;
                        }
                        i = write_data(fd, buf, len);  //发送缓冲区内容
                        if (i == 0) {
                                fprintf(stderr, "Send data error!\n");
                                break;
                        }
              }
5、从串口读数据:
        len = MAX_BUF_SIZE;
                while (1) {
                        i = read_data(fd, buf, len);  //从串口读取数据
                        if (i > 0) {
                                //count += i;
                                //fprintf(stderr, "Recv %d byte\n", i);
                                printf("%s", buf);
                                if (buf[i-1] == MY_END_CHAR) {    //如果读入的倒数第二位为停止位,则中断接受程序
                                        break;
                                }
                        }
                }



在具体的测试中,在PC机上gcc编译程序,然后用arm-linux-gcc编程程序发送到友善之臂2440的板子上,然后一边发送一边接受,这样如果发送的数据和接受的数据相同,则测试成功。

本文发布于:2024-09-20 22:30:55,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/144136.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:串口   设置   驱动   定义   标志   停止   测试程序   数据
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议