unix 下c写的串口程序调试问题!高手请进 !!!

NewAge 2002-12-27 12:27:28
unix主机有com1和com2两个串口,即/dev/tty1a和/dev/tty2a。我用串口连线(连接电子称和主机的串口线)把这两个串口连接起来,然后在终端上打开两个窗口,启动程序,一个窗口启动发送程序,打开的是/dev/tty1a串口;另一个窗口启动接收程序,打开的是
/dev/tty2a串口。可是出现了如下问题:
接收不到数据,我用select语句设置了超时控制,select返回值为0,即超时了!!

我不知道是我的程序有问题还是我连接串口方法不正确,请指点!欢迎qq给我现场指导!!
qq:85728584
...全文
79 点赞 收藏 8
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
wwwunix 2002-12-27
你要用交叉线。
你可以去买专门用来连接两台电脑的串口线。
回复
wwwunix 2002-12-27
你要先检查一下你的线对不对。不是所有的串口线都可以的。
我现在也没有串口线,不过程序我先帮你看看。
回复
痞子酷 2002-12-27
呵呵.
回复
NewAge 2002-12-27
我的程序是unix下的啊,你看我的程序有问题吗?再我的的机子上已编译通过了!
你copy到你的机子上运行,把串口连起来,看行不行啊!我真的不知道有什么不对!!拜托了
回复
wwwunix 2002-12-27
你用这根线可以将两台windows的机器连起来吗?
回复
NewAge 2002-12-27
#include <stdio.h>
#include <sys/types.h>
#include <sys/time.h>
#include <errno.h>
#include <signal.h>
#include <syslog.h>
#include <fcntl.h>
#include <termios.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>

#define OBSIZE 1024 //输出缓冲区长度
#define IBSIZE 1024 //输入缓冲区长度
#define DEF_DEVICE "/dev/tty1a"
#define DEF_BAUD B19200 //波特率
char outbuf[OBSIZE]; //定义输出缓冲区数组,发送数据
int outcnt = OBSIZE;//outbuf剩余字节数
char *outptr = outbuf;
char inputbuf[IBSIZE];//定义输入缓冲区数组,接收数据
char *ibuf=inputbuf;
int tty1; //定义设备描述符
void MessageTest(char *str)
{

printf("执行到 %s 步 \n",str);
}
void log_sys(char *str)
{
printf(str);
}
int set_nonblock_flag(int desc,int value)
{
int oldflags=fcntl(desc,F_GETFL,0);
if (oldflags==-1)
return -1;
if (value!=0)
oldflags|=O_NONBLOCK;
else
oldflags&=~O_NONBLOCK;
return fcntl(desc,F_SETFL,oldflags);

}
void tty_open(void)
{
struct termios term;
if ( (tty1= open(DEF_DEVICE, O_RDWR)) < 0)
log_sys("tty_open: open error\n");
if (tcgetattr(tty1, &term) < 0)
log_sys("tty_open: tcgetattr error\n");
term.c_cflag = CS8 | //每字节位数
CREAD | //启动接收器
CLOCAL; //忽略调制解调器状态线
term.c_oflag &=~OPOST; //执行输出处理
term.c_iflag = IXON | IXOFF | //启用启动/暂停:输出流|输入流控制
IGNBRK | //忽略输入行中的终止条件
ISTRIP | //剥夺输入字符至7位
IGNCR; //忽略CR
term.c_lflag &=~(ISIG|ECHO|ICANON|NOFLSH|XCLUDE);
term.c_lflag|=(ICANON|ECHOE);//设置加工输入方式

term.c_cc[VMIN]=0;
term.c_cc[VTIME]=1;
term.c_cc[VQUIT]=0x7f;

cfsetispeed(&term, DEF_BAUD); //设置输入波特率
cfsetospeed(&term, DEF_BAUD); //设置输出波特率
if (tcsetattr(tty1, TCSANOW, &term) < 0)
log_sys("tty_open: tcsetattr error\n");
}


void out_buf(void)
{
char *wptr, *rptr;
int wcnt, nread, nwritten,fd=1;
struct timeval timeout;
fd_set rfds, wfds;
FD_ZERO(&wfds);
FD_ZERO(&rfds);
timeout.tv_sec=15;
timeout.tv_usec=0;
wptr=outbuf;//输出缓冲区首地址
ibuf=inputbuf;//输入缓冲区首地址
wcnt=outptr-wptr; //输出缓冲区中字节个数
if (set_nonblock_flag(tty1,1)<0){
log_sys("set nonblock flag fail\n");
}
while (wcnt > 0) {
FD_SET(tty1, &wfds);
FD_SET(tty1, &rfds);
while ((fd=select(tty1+1, &rfds, &wfds, NULL,&timeout)) < 0) {
log_sys("out_buf: select error\n");
}
if (fd==0){
log_sys("timeout for select\n");
}
if (FD_ISSET(tty1, &rfds)) {
if ( (nread = read(tty1, ibuf, IBSIZE)) < 0)
log_sys("out_buf: read error\n");
ibuf+= nread;
}
if (FD_ISSET(tty1, &wfds)) {
if ( (nwritten = write(tty1, wptr, wcnt)) < 0)
log_sys("out_buf: write error\n");
wcnt -= nwritten;
wptr += nwritten;
}
}
outptr = outbuf; //outptr重新指向输出缓冲区首地址
outcnt = OBSIZE;
}
void out_char(int c)
{
if (c == EOF) { //遇到结束标志符号时调用out_buf(),发送数据至tty1,
out_buf();
return;
}
if (outcnt <= 0)
out_buf(); //输出缓冲区满时发送数据至tty1
*outptr++ = c; //其他情况保存数据至输出缓冲区
outcnt--;
}

void input_char(void)
{
int nread,fd;
//char c;//
struct timeval timeout;
fd_set rfds;
FD_ZERO(&rfds);
FD_SET(tty1,&rfds);
timeout.tv_sec=15;
timeout.tv_usec=0;
if (set_nonblock_flag(tty1,1)<0){
log_sys("set nonblock flag fail\n");
}
if ((fd=select(tty1 + 1, &rfds, NULL, NULL, &timeout)) <0) {
log_sys("receive_char: select error\n");
}
if (fd==0)
printf("time out\n");

if ( (nread = read(tty1,ibuf,IBSIZE)) < 0)
log_sys("receive_char: read error\n");
else if (nread == 0)
log_sys("receive_char: read returned 0\n");
ibuf+= nread;

}
void send_char(void)
{
char c;
printf("从键盘输入发送数据\n");
while ((c=getchar())!=EOF)
out_char(c);//输入字符送入缓冲区
out_char(EOF);
}
void receive_char(void)
{
char c;
printf("等待接收数据\n");
input_char();
printf(inputbuf);//打印接受到的字符

}


main(int argc, char *argv[])
{
char c;
tty_open();
printf("按's'键发送数据,否则接收数据\n");
if ( (c = getchar())=='s') {
send_char();
}
printf("接收数据状态\n");
receive_char();
close(tty1);
exit(0);
}
回复
NewAge 2002-12-27
我的是连接串口设备(电子称)和电脑串口的一根数据线!!我用这根线直接把电脑的两个串口连接在一起了,在一台电脑上开两个窗口做发送/接受的测试,但是就是不行,出现我上面提到的问题!!这和我termios的参数设置有关吗,还是程序其他方面的原因,还是串口连接的不对呢??

盼高手指点,以下是源码!!
回复
good02xaut 2002-12-27
关注!
回复
相关推荐
发帖
Linux/Unix社区
创建于2007-08-27

2.1w+

社区成员

Linux/Unix社区 应用程序开发区
申请成为版主
帖子事件
创建了帖子
2002-12-27 12:27
社区公告
暂无公告