找回密码
 注册
楼主: kaolacatty

关于串口的问题

[复制链接]
 楼主| 发表于 2004-11-3 07:56:42 | 显示全部楼层
我又做了一下小改动,现在的现在是开机以后第一次运行时,发出数据后就停在read的位置了,如果有数据来,就原样返回去(发数的机器又收到了一样的数)。运行一次minicom后一切就都好用了,之后只要不关机就都好用。下面是我的主函数部分,其它的部分没有改动。
int main(int argc, char **argv)
{
        int fd;
        int nread=0;
        int nwrite=0;
        char buffr[512];
        char buffw[512]={49,50,51,52,53,54,55,56,57};
        char *dev ="/dev/ttyS0";
        int i;
        fd = OpenDev(dev);
        if (fd>0)
                set_speed(fd,9600);
        else
        {
                printf("Can't Open Serial Port!\n");
                exit(0);
        }
                if (set_Parity(fd,8,1,'N')== FALSE)
               {
                                printf("Set Parity Error\n");
                                exit(1);
               }
               while(1)
       
              {
                printf("....1....\n");
        nwrite=write(fd,buffw,9);
        printf("nwrite=%d\n",nwrite);
        for(i=0;i<nwrite;i++)
        printf("%c",buffw);

        nread = read(fd,buffr,20);
        printf("\nnread=%d\n",nread);

        for(i=0;i<nread;i++)
        printf("%c",buffr);
                if(buffr[5]==4break;
                }
   close(fd);
   // exit(0);
}
回复

使用道具 举报

发表于 2004-11-3 10:04:23 | 显示全部楼层
[quote:544815fc75="llc"]试试初始化时:
fcntl(fd, F_SETFL, FNDELAY);

Reading Data from the Port



Reading data from a port is a little trickier. When you operate the port in raw data mode, each read(2) system call will return however many characters are actually available in the serial input buffers. If no characters are available, the call will block (wait) until characters come in, an interval timer expires, or an error occurs. The read function can be made to return immediately by doing the following:

fcntl(fd, F_SETFL, FNDELAY);



The FNDELAY option causes the read function to return 0 if no characters are available on the port. To restore normal (blocking) behavior, call fcntl() without the FNDELAY option:

fcntl(fd, F_SETFL, 0);



This is also used after opening a serial port with the O_NDELAY option.
[/quote]
加这个啊,不加这个read不到数据时程序会假死
回复

使用道具 举报

发表于 2004-11-3 10:07:01 | 显示全部楼层
上google搜索“Serial Programming Guide for POSIX Operating Systems”,这文章有串口的详细资料
回复

使用道具 举报

 楼主| 发表于 2004-11-4 08:35:40 | 显示全部楼层
加了这句以后,我就什么也收不到了,即使我下面1ms发一个数,返回的全是-1。
你说的那篇文章我开始做的时候就下了,可由于我的英语水平比较差对它的理解总是有误,另外有些常量我也不知道是什么含义,只能一点点的试程序。
现在还是那个现象
开机以后第一次运行时,发出数据后就停在read的位置了,如果有数据来,就原样返回去(发数的机器又收到了一样的数)。运行一次minicom后一切就都好用了,之后只要不关机就都好用
回复

使用道具 举报

 楼主| 发表于 2004-11-4 09:02:36 | 显示全部楼层
我想问一下,使用了一次minicom以后,它对串口到底做了什么了?
我觉得可能问题还在初始化上,可能是minicom对串口初始化的时候把某个值该了,而我的初始话的时候没做这个动作。
回复

使用道具 举报

发表于 2004-11-5 16:03:57 | 显示全部楼层
http://www.linuxfans.org/nuke/modules.php?name=Forums&file=viewtopic&t=55576&highlight=%B4%AE%BF%DA+raw
看看这里,你的情况好像有点像,但你上面的代码好像已经是raw模式了
回复

使用道具 举报

 楼主| 发表于 2004-11-6 10:45:18 | 显示全部楼层
恩,的确,他的现象和我的很象。不过也有点特殊,只要我开机以后开一次minicom什么也不做在关。以后怎么运行我的程序也没问题。
我已经是raw模式了
哎,我只能说是linux太博大精深了,不出问题就也算了,一旦什么地方出了问题,想改都没办法。
回复

使用道具 举报

发表于 2004-11-6 10:57:02 | 显示全部楼层
呵呵,我以前也碰到这个问题,打开minicom就好了,后来我改成law模式就好了
我的flag
struct termios   Opt;
Opt.c_cflag |= (CLOCAL | CREAD);
Opt.c_lflag &=~(ICANON | ECHO | ECHOE | ISIG);  //设置为RAW模式
Opt.c_oflag &=~OPOST;           //设置为RAW模式
Opt.c_iflag &=~(IXON | ICRNL);  //不处理控制字符
回复

使用道具 举报

 楼主| 发表于 2004-11-6 11:49:33 | 显示全部楼层
把你的代码加上果然还用了。不过问题可能不出在RAW模式上
Opt.c_cflag |= (CLOCAL | CREAD);
Opt.c_lflag &=~(ICANON | ECHO | ECHOE | ISIG); //设置为RAW模式
Opt.c_oflag &=~OPOST; //设置为RAW模式
这三句我都做了了。
Opt.c_iflag &=~(IXON | ICRNL); //不处理控制字符
这个可能是问题,我再研究研究。
十分感谢llc和mozilla的帮助
回复

使用道具 举报

发表于 2004-11-6 16:24:37 | 显示全部楼层
Opt.c_iflag &=~(IXON | ICRNL); //不处理控制字符
这个可能是问题,我再研究研究。
十分感谢llc和mozilla的帮助

研究完后如果有结果,还望跟跟帖,以后还有朋友遇到类似问题时就能解决
回复

使用道具 举报

 楼主| 发表于 2004-11-19 15:46:21 | 显示全部楼层
这段时间一直在找新工作,所以没什么时间研究。现在刚到新单位,正好有时间。
我想进入它的驱动看看,怎么才能看到串口的驱动程序呢?
回复

使用道具 举报

发表于 2004-11-19 18:25:34 | 显示全部楼层
内核源码里,drivers/char/serial.c
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2025-2-11 15:54 , Processed in 0.032982 second(s), 13 queries .

© 2001-2025 Discuz! Team. Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表