导航:首页 > 操作系统 > linux串口程序c

linux串口程序c

发布时间:2023-05-28 05:21:48

1. C语言串口设置问题:linux下怎么用C语言设置串口通讯的MARK, SPACE校验

struct termios opt;

memset(&opt, 0, sizeof(opt));
cfmakeraw (&opt);
opt.c_cflag |= CLOCAL | CREAD | CS8; //8bit
opt.c_cflag &= ~(PARENB | CSTOPB); //no parity check,no stop bit
opt.c_cc[VMIN] = 1;
opt.c_cc[VTIME] = 0; /*read waite for x*0.1s*/
更多知识看看unix环境高级编程-终端编程哪一章,或网络linux串口编程。

2. Linux C 配置串口

配置串口需要包含头文件

其中最核心的配置结构体为:

如何获取该结构呢?我们操作串口跟操作文件一样,也是调用 open() 函数来打开串口,

这样我们就能够得到一个文件描述符 fd ,然后就可以调用 tcgetattr() 函数来获取上述配置结构体了。

Linux 串口默认的配置为:波特率 9600,数据位 8 位,无奇偶校验,停止位 1 位,无 CTS/RTS 。

以下介绍一些常用的配置项:波特率、奇偶校验、数据位、停止位、硬件控制流。

相关接口:

Linux 将串口的波特率分为了输入波特率和输出波特率,不过最常用的场景是将两者设置成一样。

cfgetispeed() 函数获取输入波特率, cfgetospeed() 函数获取输出波特率。 cfsetispeed() 函数设置输入波特率, cfsetospeed() 函数用于设置输出波特率,当然 cfsetspeed() 函数扩展为同时设置输入和输出波特率。

上述接口中的 speed_t 是一系列波特率的标志位,例如常用的 115200 波特率就为 B115200,参考下述选项:

设置奇偶校验位可以通过修改 termios 结构体中的 c_cflag 成员来实现,若无校验,则将 PARENB 位设为 0;若有校验,则 PARENB 为 1。之后再根据 PARODD 来区分奇偶校验, PARODD 为 1 表示奇校验, PARODD 为 0 表示偶校验。例如设置无奇偶校验位:

设置数据位可以通过修改 termios 结构体中的 c_cflag 成员来实现,CS5、CS6、CS7 和 CS8 分别代表数据位 5、6、7 和 8。不过在设置数据位之前,需要先用 CSIZE 来做屏蔽字段,清楚这几个标志位,例如设置数据位为 8 位:

设置停止位可以通过修改 termios 结构体中的 c_cflag 成员来实现, CSTOPB 位为 1 表示 2 位停止位, CSTOPB 位为 0 标志 1 位停止位。例如设置停止位为 1 位:

设置硬件控制流可以通过修改 termios 结构体中的 c_cflag 成员来实现, CRTSCTS 为 1 表示使用硬件控制流,为 0 表示不使用硬件控制流。例如使能硬件控制流:

当然,最后还需要用 tcflush() 抛弃存储在 fd 里的未接收的数据。

再利用接口 tcsetattr() 函数将配置信息写入文件描述符 fd :

这样整个串口最常用的用法就配置完成了。

具体的配置使用可以参考我的项目 HCI-Middleware 里的 hci_transport_uart_linux.c 文件。

参考:

3. 如何在LINUX下编写一个C语言的串口程序

1、参考这个:POSIX操作系统串口编程指南和 UNIX环境高级编程。
2、简单介绍一下:
《POSIX操作系统的串口编程指南》是在UNIX环境或PC上对串口进行编程的教程,每一章提供的例程都使用POSIX(Portable Standard for UNIX)终端控制函数,只需极少的修改就可运行在IRIX 、HP-UX、 SunOS、 Solaris、 Digital UNIX、 Linux等大多数类UNIX操作系统。

4. Linux 用C写串口(modem)(急!)

是的,linux是linus
tovalds当时为了研究一个多用户多任务操作系统,用c代码编写了一个很小的操作系统内核,他把这个源码公布,大家都来修改它和发展它,最终发展成现在的linux操作系统.

5. 怎样用C/C++在Linux系统实现串口通讯

Linux下面有设备文件
串口装好驱动后 会显示在dev下
然后对这个设备文件进行读写即可。
比windows要简单的多。

6. 关于怎样在linux上用C写串口收发数据程序

对于编程来说,没什么区别,通过控制485的使能端该程序完全可以使用。唯一的区别就是你在发送的时候通过程序把485的控制脚拉高,接收的时候把他拉低就可以了。至于电气方面的区别:RS232是全双工,可以同时收发,RS485是半双工,不能同时收发,还有电平信号不一样,这个编程你就不要理了。

7. LINUX和开发版 串口程序编写问题

分类: 电脑/网络 >> 程序设计 >> 其他编程语言
问题描述:

速度征求答案 正确追加100分 2小时之内 谢谢

#include <termios.h>

#include <stdio.h>

#include <unistd.h>

#include <ftl.h>

#include <pthread.h>

#define BAUDRATE B115200

#define 1 "/dev/ttyS0"

#define 2 "/dev/ttyS1"

#define ENDMINITERM 27

#define FALSE 0

#define TRUE 1

volatile int STOP=FALSE;

volatile int fd;

void* keyboard(void * data)

{

int c;

for (;;){

c=getchar();

if( c== ENDMINITERM){

STOP=TRUE;

break ;

}

}

return NULL;

}

void* receive(void * data)

{

int c;

printf("read modem\n");

while (STOP==FALSE)

{

在此处补充填写代码?实现读取串口数据、并将数据在标准终端上写出来

}

printf("exit from reading modem\n");

return NULL;

}

void* send(void * data)

{

int c='0';

printf("send data\n");

while (STOP==FALSE)

{

c++;

c %= 255;

在此处补充填写代码?实现写入串口数据

usleep(1000000);

}

printf("exit from send modem\n");

return NULL;

}

int main(int argc,char** argv)

{

struct termios oldtio,newtio;

pthread_t th_a, th_b, th_c;

在此处补充填写代码?实现打开串口1的功能

if (fd <0) {

perror(1);

exit(-1);

}

tcgetattr(fd,&oldtio);

newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;/*ctrol flag*/

newtio.c_iflag = IGNPAR;

newtio.c_oflag = 0;

newtio.c_lflag = 0;

newtio.c_cc[VMIN]=1;

newtio.c_cc[VTIME]=0;

tcflush(fd, TCIFLUSH);

tcsetattr(fd,TCSANOW,&newtio);

在此处补充填写代码?实现创建键盘监控、接收、发送三个线程,并等神扒待线程结束

tcsetattr(fd,TCSANOW,&oldtio); /*恢复串口设置*/

在此处补充填写代码?实现关闭串口功能

exit(0);

}

解析:

while (STOP==FALSE)

{

在此处补充填写代码?实现读取串口数据、并将数据在标准终端上写出来

if(read(fd, data, ENDMINITERM)==0)

return data;

}

while (STOP==FALSE)

{

c++;

c %= 255;

在此处补充填写代码?实现写入渣瞎氏串口数据

if(write(fd, data, ENDMINITERM) < 0)

exit(1);

usleep(1000000);

}

在此处补充填写代码?实现打开串口1的功能

fd = open(1,O_RDWR);

if(fd < 0)

exit(1);

在此处补充填写代码?实现创建键盘监控如散、接收、发送三个线程,并等待线程结束 th_a, th_b, th_c;

if(pthread_create (&th_a, 0, keyboard, 0) != 0)

exit(1);

pthread_join(th_a,NULL);

if(pthread_create (&th_b, 0, receive, 0) != 0)

exit(1);

pthread_join(th_b,NULL);

if(pthread_create (&th_c, 0, send, 0) != 0)

exit(1);

pthread_join(th_c,NULL);

在此处补充填写代码?实现关闭串口功能

close(fd);

阅读全文

与linux串口程序c相关的资料

热点内容
手机淘宝登录怎么加密码 浏览:481
linux快捷方式图标 浏览:33
阳光车险的app叫什么名字 浏览:461
购买单片机的器件时需要给商家啥 浏览:534
并行编译技术的发展 浏览:549
阿里云服务器安装管理 浏览:550
java手机开发教程 浏览:673
我的世界怎么删除服务器数据 浏览:670
linux内存子系统 浏览:972
加密思维币 浏览:690
魅族访客文件夹 浏览:52
添加的文件夹怎么找 浏览:617
程序员涉黄 浏览:700
maven编译resources下的js 浏览:521
ubuntu文件移动命令 浏览:229
安卓i怎么查找苹果手机 浏览:951
云服务器宕机概率 浏览:232
在线买药用什么app知乎 浏览:815
ubuntu解压xz文件 浏览:676
宏杰加密时电脑关机 浏览:390