QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1853|回复: 6

会点串口编程的近来帮帮忙!

[复制链接]
发表于 2004-2-25 13:51:16 | 显示全部楼层 |阅读模式
代码如下:
[code:1]
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
main(int argc,char** argv)
{
        int com1;
        struct termios options;
        int i;
        unsigned char cmd[] = {0x1b,0x80,0x07,5,0xa7,0};
        unsigned char buf[1];
        com1=open("/dev/ttyS0",O_RDWR);
        if(com1)
        {
                tcgetattr(com1,&options);
                cfsetispeed(&options,B9600);
                cfsetospeed(&options,B9600);
                options.c_cflag |=(CLOCAL | CREAD);
                tcsetattr(com1,TCSANOW,&options);
                tcflush(com1,TCIOFLUSH);
               
                for(i=0;i<5;i++)
                {
                        usleep(5);
                        write(com1,cmd+i,1);
                }
                for(i=0;i<10;i++)
                {
                        read(com1,buf,1);
                        printf("%c\n",buf[0]);
                }
                close(com1);
        }
        else
        {
                printf("cannot open com1");
                exit(1);
        }
}
[/code:1]
com1接着一个设备,给他发{0x1b,0x80,0x07,5,0xa7,0}他就会返回数据
运行上面的程序设备能接受到{0x1b,0x80,0x07,5,0xa7,0},也发出数据了,但程序就是不能从串口读出数据,阻塞在read语句那,但如果此时打开minicom,read就能进行下去并能正确读出数据,不过如果先打开minicom后执行程序设备就收不到{0x1b,0x80,0x07,5,0xa7,0}了。
我猜测minicom是对串口做了一些初始化,所以能读
要怎么设置串口才能又能读又能写呢
以上过程中程序没有错误信息返回。
发表于 2004-2-25 14:55:01 | 显示全部楼层
看看这个有没有帮助
http://www.linuxfans.org/nuke/modules.php?name=News&file=article&sid=1864&mode=&order=0&thold=0
回复

使用道具 举报

发表于 2004-2-25 14:57:53 | 显示全部楼层
会不会是数据校验位这些没设置好?
回复

使用道具 举报

 楼主| 发表于 2004-2-25 15:34:05 | 显示全部楼层
应该不是,setParity(fd,8,1,'N')也不行
回复

使用道具 举报

发表于 2004-2-25 16:28:20 | 显示全部楼层
那会不会波特率接收速度的设置有问题?
我没试过从com口通讯,我的机器上只有1个COM口,上面转贴的文章我没办法做验证

顺便问问,正常情况下,如果你的设备向com口发出了信息,而你的程序如果错过了read时机(譬如read的动作比较迟),那read语句执行的结果是什么?是NULL吗?
回复

使用道具 举报

 楼主| 发表于 2004-2-25 23:46:40 | 显示全部楼层
哈哈,问题解决了,是端口模式的问题,改成raw模式就能马上读到数据了。
read是半阻塞的,如果在VTIME时间(单位是0.1秒)内读不到数据,read就返回0,在VTIME时间内read一直等数据。设备往串口写东西,应该会保存在缓冲里(除非写得太多溢出),所以即使不马上read也没关系,数据还是能read到得。
回复

使用道具 举报

发表于 2004-2-26 14:40:14 | 显示全部楼层
嘿嘿,学到东西了
找天我找台有两个com口的机器也来测试一下
回复

使用道具 举报

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

本版积分规则

GMT+8, 2024-11-8 22:49 , Processed in 0.067952 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

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