使用C语言操作串口

其实这并不是一件很难的事,在自己动手实验之前,我自然是知道现代操作系统都将设备看成文件来处理,这无疑降低了程序员操作硬件的难度,使用标准IO就可以操作硬件。

我上网查了一下“windows C语言 串口”,希望能得到一些示例,但是没有成功,我得到的不是用CreateFile就是用这个模块那个模块,甚至扯上了用BIOS等恐龙时代的东东。无语,还是自己试一下的好。

编译。。。运行。。。!!不好使啊,this way doesn't work!!!。wait 有个关键因素忘记了,我的U口转串口是com3,但是我还没有插入U口转串口啊!插上,哈哈,this way works!。但这还不能说明问题啊,我又用我的丁丁串口调试助手进行了一下测试,哈哈“该串口正在使用”。这回确信无疑了,方法是好使的,没想到竟然这么简单,那些人啊,把简单的事情弄复杂了!!!进一步操作。我要接受串口数据。

 

啊哈,刚开始的我是没有加if(fgets(buf,100,fp)!=0) 这个判断的,结果打印一连串的空行,刚开始还很奇怪,后来明白了,自己的编程能力有下降了!但是还是有些问题,有时候有错的字符,而且绝大多数时候的输出在不同的地方或多或少的加了回车,这应该是经过一次fgets()没有一次将数据读入,导致的结果。而之所以会出现乱码,是因为程序中有中文字符,中文字符占两个字节,而在中文字符一个字节之后断开,导致后续的字符解释失误,这在其他程序中也是有的现象!我在一个小的测试中初步证实了猜测,做法就是在puts后再puts("----")结果发现一次输出中加载了几次"---"。

我又打印了我获得数据的10进制值,发现大量的未显示字符其实是0x01也就是SOH,Start of heading。那么这就好解决了。(弄错了啊,是-1,不明白是怎么回事,好像getc将不能显示的字符返回-1?)

那么程序应该更改成:

哈哈,这回可以了,加上那个Sleep()的目的是防止CPU的使用率过高。嘿嘿,到此结束!!!满意的原创!!!

 

  • 16
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
Linux是一款兼容UNIX的操作系统,它提供了广泛的开发和应用环境。在许多嵌入式应用、通信设备和实时控制应用中,串口通讯被广泛应用。本文将介绍如何使用C语言在Linux中操作串口进行传输数据的相关知识。 串口是计算机中重要的外设之一,它是一种通过RS-232标准接口进行数据传输的设备。在Linux中,可以使用tty设备来表示串口串口的读写操作,可以通过使用Linux系统提供的设备驱动程序进行实现。 对于通过串口进行通讯的应用场景来说,需要使用C语言来控制串口的打开、关闭、读写等操作。下面就来介绍一下如何使用C语言进行串口编程。 首先,要使用fopen()函数打开串口设备文件,代码如下: ``` #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <termios.h> #include <unistd.h> int main() { int fd; fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY); if(fd == -1) { printf("Error: cannot open serial port.\n"); exit(0); } /* Other operations */ close(fd); return 0; } ``` 在这个例子中,"/dev/ttyUSB0"代表的是一个USB口设备。O_RDONLY或O_WRONLY为文件打开时的读写权限,O_NOCTTY表示不把串口作为控制终端,O_NDELAY表示无阻塞方式。 接下来需要对串口进行配置。配置的内容有:波特率、数据位、停止位等。这些配置通过termios结构体进行配置。代码如下: ``` struct termios opt; tcgetattr(fd, &opt); cfsetispeed(&opt, B9600); cfsetospeed(&opt, B9600); opt.c_cflag &= ~CSIZE; opt.c_cflag |= CS8; opt.c_cflag &= ~CSTOPB; opt.c_cflag &= ~(PARENB | PARODD); opt.c_cflag |= IGNPAR; opt.c_cflag &= ~(ICANON | ECHO | ECHOE | ISIG); opt.c_oflag &= ~OPOST; opt.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); opt.c_cc[VMIN] = 1; opt.c_cc[VTIME] = 0; tcsetattr(fd, TCSANOW, &opt); } ``` 其中,cfsetispeed()和cfsetospeed()用于设置输入输出波特率,CSIZE也就是数据位有五个选项,分别是CS5、CS6、CS7、CS8、CS16,这里选择了CS8。CSTOPB代表停止位有一个或两个,这里选择了一个。PARENB和PARODD代表是否开启奇偶校验位,这里选择了不开。IGNPAR为忽略校验错。ICANON、ECHO、ECHOE、ISIG等代表输入方式、输出方式和控制模式。VTIME和VMIN代表在无数据到来的情况下读取的最大等待时间和最小字符数。 若要在串口中传送数据,需要使用write()函数进行写入操作。代码如下: ``` write(fd, buf, len); ``` 其中,fd为串口设备文件描述符,buf为写入缓存区的数据,len为数据长度。如果要读取数据,则需要使用read()函数。代码如下: ``` read(fd, buf, len); ``` 当从串口读取数据时,这个函数会一直阻塞,直到读到足够的数据或者时间超时。同样地,fd为串口设备文件描述符,buf为存放读取数据的缓冲区,len为读取数据的字节数。 最后,要关闭串口设备文件,使用close()函数就可以了。代码如下: ``` close(fd); ``` 在本文中,我们介绍了如何使用C语言在Linux中操作串口进行数据传输。针对不同的串口设备,我们需要根据不同的设备文件进行调整。串口编程本质上是使用Linux系统提供的设备文件读写操作函数进行控制。如果您需要深入学习Linux中串口编程的相关技术,请关注Linux内核驱动开发等相关方面的知识。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值