关于LINUX的串口编程(解决问题者另开帖每人100-200分,UP有分!!!!!!!!!)

Joran 2003-05-29 11:02:50
小弟最近在研究LINUX的串口编程,看过了《Linux 程序设计》和《Linux Serial Programming HOW-TO》上的有关串口编程的介绍。我试验着把COM1和COM2直接连接起来。稍微改编了一下lpg中miniterm.c,分成两个程序read_com.c和write_com.c。我分别在tty1和tty2运行这两个程序。令人不解的是这两个程序不能正常的通讯(我的COM1和COM2经测试,同一条线,在WINDOWS下是好的)。另外,为何两个程序的打开的文件描述符都是3?
read_com.c和write_com.c分别如下。望高手指点帮着解决这个问题,并希望再点拨小弟一下有关Linux串口编程的细节(我想用两个串口,每个控制一个设备)。如果有更详细的资料或者是代码请告诉小弟。谢谢!!
解决问题者另开帖每人100-200分(觉得不够可以再加,我都快被这个郁闷死了),UP有分
...全文
296 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ten0201 2003-06-10
  • 打赏
  • 举报
回复
UP...可惜偶是菜鸟...不然....
wutong312 2003-06-10
  • 打赏
  • 举报
回复
你载一个minicom工具,对串口直接进行初始化,然后对串口文件直接打开读写就行了,不知道你是不是需要这方面的知识,不用上面那么复杂,这样简单一点
kakafung 2003-06-10
  • 打赏
  • 举报
回复
没发现前后给出的代码有什么区别啊
lpc007 2003-06-10
  • 打赏
  • 举报
回复
up
hover_online 2003-06-09
  • 打赏
  • 举报
回复
我们得东西也要用,多谢!
ljb130 2003-06-08
  • 打赏
  • 举报
回复
up&gz
Joran 2003-06-08
  • 打赏
  • 举报
回复
to Hobbytp(谭鹏) :
newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;

/*
Ignore bytes with parity errors and make terminal raw and dumb.
*/
newtio.c_iflag = IGNPAR;

/*
Raw output.
*/
newtio.c_oflag = 0;

/*
Don't echo characters because if you connect to a host it or your
modem will echo characters for you. Don't generate signals.
*/
newtio.c_lflag = 0;
Hobbytp 2003-06-08
  • 打赏
  • 举报
回复
我只想知道错在哪里,分倒不重要
Joran 2003-06-08
  • 打赏
  • 举报
回复
大家还可以来拣分啊。:)
Joran 2003-06-08
  • 打赏
  • 举报
回复
问题已经解决,Linux Serial Programming HOW-TO给的例子是错误的。
哈哈。
Joran 2003-05-31
  • 打赏
  • 举报
回复
to fwbmail(斌) :
2, 3线交叉.windows 下可以正常收发信息.
fwbmail 2003-05-31
  • 打赏
  • 举报
回复
把两个com口直接连接,你的针脚也是对号连接的吗?我不太清楚具体的连接方式,不过我看到有
文章说,自己制作的COM线,需要变换阵脚的
hitsmail 2003-05-30
  • 打赏
  • 举报
回复
我也遇到同样的问题。我是在unix上测试都是可以读并可以写的,将程序改造到linux上就不能读和写了。

如果有详细的资料可以发送到我的信箱中!
lih@ffcs.fujitsu.co.jp
谢谢


关注中!

vcsongs 2003-05-30
  • 打赏
  • 举报
回复
关注
Joran 2003-05-30
  • 打赏
  • 举报
回复
当然是先设置好权限了。:(
我说的tty1和tty2是指virtual console(虚拟控制台)!
lubaixu 2003-05-30
  • 打赏
  • 举报
回复
好厉害呀.
我什么时候也可以这样高谈阔论.........
Legend 2003-05-30
  • 打赏
  • 举报
回复
另外,你前面说的是ttyS1和ttyS2,程序中却是0和1,不知道是否写错了。com1和com2应当是ttyS0和ttyS1,确定一下。
Legend 2003-05-30
  • 打赏
  • 举报
回复
先 ll /dev/ttyS* 看看权限是不是设置好了
solar 2003-05-29
  • 打赏
  • 举报
回复
gz
Joran 2003-05-29
  • 打赏
  • 举报
回复
文件read_com.c 内容

/* File: read_com.c */

#include <termios.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/signal.h>

#define BAUDRATE B38400
#define MODEMDEVICE "/dev/ttyS0"
#define ENDMINITERM 2 /* ctrl-b to quit miniterm */

#define _POSIX_SOURCE 1 /* POSIX compliant source */

#define FALSE 0
#define TRUE 1

volatile int STOP = FALSE;

void child_handler(int s)
{
STOP = TRUE;
}

main()
{
int fd, c;
struct termios oldtio, newtio, oldstdtio, newstdtio;
struct sigaction sa;

/*
Open modem device for reading and writing and not as controlling tty
because we don't want to get killed if linenoise sends CTRL-C.
*/
fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY);
if (fd < 0) {
perror(MODEMDEVICE);
exit(-1);
}

tcgetattr(fd, &oldtio); /* save current modem settings */

/*
Set bps rate and hardware flow control and 8n1 (8bit,no parity,1 stopbit).
Also don't hangup automatically and ignore modem status.
Finally enable receiving characters.
*/
newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;

/*
Ignore bytes with parity errors and make terminal raw and dumb.
*/
newtio.c_iflag = IGNPAR;

/*
Raw output.
*/
newtio.c_oflag = 0;

/*
Don't echo characters because if you connect to a host it or your
modem will echo characters for you. Don't generate signals.
*/
newtio.c_lflag = 0;

/* blocking read until 1 char arrives */
newtio.c_cc[VMIN] = 1;
newtio.c_cc[VTIME] = 0;

/* now clean the modem line and activate the settings for modem */
tcflush(fd, TCIFLUSH);
tcsetattr(fd, TCSANOW, &newtio);

/*
Strange, but if you uncomment this command miniterm will not work
even if you stop canonical mode for stdout. This is a linux bug.
*/
// tcsetattr(1, TCSANOW, &newtio); /* stdout settings like modem settings */

/* next stop echo and buffering for stdin */
tcgetattr(0, &oldstdtio);
tcgetattr(0, &newstdtio); /* get working stdtio */
newstdtio.c_lflag &= ~(ICANON | ECHO);
tcsetattr(0, TCSANOW, &newstdtio);

/* terminal settings done, now handle in/ouput */
switch (fork()) {
case 0: /* child */
/* user input */
//close(1); /* stdout not needed */
printf("Fork child process\n");
for (c = getchar(); c != ENDMINITERM; c = getchar()) {
write(fd, &c, 1);
printf("write %c to fd %d\n", c, fd);
}
tcsetattr(fd, TCSANOW, &oldtio); /* restore old modem setings */
tcsetattr(0, TCSANOW, &oldstdtio); /* restore old tty setings */
close(fd);
exit(0); /* will send a SIGCHLD to the parent */
break;
case -1:
perror("fork");
tcsetattr(fd, TCSANOW, &oldtio);
close(fd);
exit(-1);
default: /* parent */
//close(0); /* stdin not needed */
printf("Fork parent process\n");
sa.sa_handler = child_handler;
sa.sa_flags = 0;
sigaction(SIGCHLD, &sa, NULL); /* handle dying child */
while (STOP == FALSE) { /* modem input handler */
printf("Looping for read...\n");
read(fd, &c, 1); /* modem */
//write(1, &c, 1); /* stdout */
printf("receive %c\n", c);
}
wait(NULL); /* wait for child to die or it will become a zombie */
break;
}
}

加载更多回复(4)
Linux系统提供了各种系统调用API用于进程之间的通信:    无名管道PIPE    命名管道FIFO    消息队列    共享内存    信号量    文件锁    信号signal....其中还包括system V和POSIX 两种接口标准,除此之外,Linux系统自身还扩展了自己的一套API接口用于进程间通信,比如signalfd、timerfd、eventfd等。本视频教程为《Linux系统编程》第05期,本期课程将会带领大家学习Linux下将近15种进程间通信IPC工具的使用,了解它们的通信机制、编程实例、使用场景、内核中的实现以及各自的优缺点。本课程会提供PDF版本的PPT课件和代码,学员购买课程后可到课程主页自行下载嵌入式自学路线指导图:------------------------------------------------------------------------------------------------------                   《嵌入式工程师自我修养》嵌入式自学系列教程                                          作者:王利涛------------------------------------------------------------------------------------------------------一线嵌入式工程师精心打造,嵌入式学习路线六步走: 第 1 步:Linux三剑客零基础玩转Linux+UbuntuGit零基础实战:Linux开发技能标配vim从入门到精通基础篇:零基础学习vim基本命令vim从入门到精通定制篇:使用插件打造嵌入式开发IDEmakefile工程实践基础篇:从零开始一步一步写项目的Makefilemakefile工程实践第2季:使用Autotools自动生成Makefile软件调试基础理论printf打印技巧Linux内核日志与打印使用QEMU搭建u-boot+Linux+NFS嵌入式开发环境第 2 步:C语言嵌入式Linux高级编程第1期:C语言进阶学习路线指南第2期:计算机架构与ARM汇编程序设计第3期:程序的编译、链接和运行原理第4期:堆栈内存管理第6期:数据存储与指针第7期:嵌入式数据结构与Linux内核的OOP思想第8期:C语言的模块化编程第9期:CPU和操作系统入门      搞内核驱动开发、光会C语言是不行的!      你还需要学习的有很多,包括:计算机体系架构、ARM汇编、程序的编译链接运行原理、CPU和操作系统原理、堆栈内存管理、指针、linux内核中的面向对象思想、嵌入式系统架构、C语言的模块化编程.....第 3 步:Linux系统编程第00期:Linux系统编程入门第01期:揭开文件系统的神秘面纱第02期:文件I/O编程实战第03期:I/O缓存与内存映射第04期:打通进程与终端的任督二脉第05期:进程间通信-------------------we are here!‍    第 4 步:Linux内核编程‍    练乾坤大挪移,会不会九阳神功,是一道坎。搞驱动内核开发,懂不懂内核也是一道坎。第 5 步:嵌入式驱动开发    芯片原理、datasheet、硬件电路、调试手段、总线协议、内核机制、框架流程....第 6 步:项目实战    嵌入式、嵌入式人工智能、物联网、智能家居...

23,124

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧