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);