LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1035|回复: 5

请教串口读写问题

[复制链接]
发表于 2006-9-12 11:47:24 | 显示全部楼层 |阅读模式
我是linux编程方面的新手,正在学习linux串口方面的,下面是我读串口的代码
void read_com(int com_fd)
{
    struct HEAD *head;
    char buffer[1024];
    int totalread=0;
    int readbyte,remainbyte=0;

    while(1)
    {
        while((readbyte=read(com_fd,buffer+totalread,HEAD_SIZE))>0)
        {
            totalread+=readbyte;
            if(totalread==HEAD_SIZE)
            {
                head=(struct HEAD *)buffer;
                if((head->mag_num==MAGNUM)&&(head->len==totalread))
                {
                    printf("读取到一个完整的包,");
                    printf("包的各个结构成员如下:\n");
                    printf("\tmag_num:     %08x\n",head->mag_num);
                    printf("\tvendor_info: %08x\n",head->info);
                    printf("\ttype:        %08x\n",head->type);
                    printf("\tlen:         %08x\n",head->len);
                    printf("\tseq:         %08x\n",head->seq);
                    printf("\tchesum:      %08x\n",head->chesum);
                    printf("\tmag_end:     %08x\n",head->end);
                    printf("\n\n");

            if(head->type==SWREQ_START)
           {
                       write_com(com_fd,3);       
           }

                    totalread=0;
        }
                else
                {
                    printf("接收到的字符为:%x\n",buffer);
                    printf("fd is :%d\n",fd);
                    printf("魔术字出错,还是包的判断算法出错?\n");
                    totalread=0;
                    continue;
                }
            }
        }
    }
}

我的本意是:
自己定义了一个数据结构,然后通过冲串口接收从一个设备发过来的数据,然后打印出来,对于特定的消息则发送回应过去。现在的问题是,如果设备在本程序之前启动,那么一切正常,但是,如果先启动本程序,然后再启动设备(也就是本程序在设备之前运行),那么就读不到任何数据(该硬件设备在关闭的时候发送00,开启的时候也会发送几个干扰字符),我向请问各位,这到底是怎么回事呢?是串口控制问题还是设备读写判断有问题呢?

不知道我的意思说清楚了没?
发表于 2006-9-12 15:34:23 | 显示全部楼层
先帮你排版一下代码
[PHP]
void read_com(int com_fd)
{
        struct HEAD *head;
        char buffer[1024];
        int totalread=0;
        int readbyte,remainbyte=0;

        while(1)
        {
                while((readbyte=read(com_fd,buffer+totalread,HEAD_SIZE))>0)
                {
                        totalread+=readbyte;
                        if(totalread==HEAD_SIZE)
                        {
                                head=(struct HEAD *)buffer;
                                if((head->mag_num==MAGNUM)&&(head->len==totalread))
                                {
                                        printf("读取到一个完整的包,");
                                        printf("包的各个结构成员如下:\n");
                                        printf("\tmag_num: %08x\n",head->mag_num);
                                        printf("\tvendor_info: %08x\n",head->info);
                                        printf("\ttype: %08x\n",head->type);
                                        printf("\tlen: %08x\n",head->len);
                                        printf("\tseq: %08x\n",head->seq);
                                        printf("\tchesum: %08x\n",head->chesum);
                                        printf("\tmag_end: %08x\n",head->end);
                                        printf("\n\n");

                                        if(head->type==SWREQ_START)
                                        {
                                                write_com(com_fd,3);
                                        }

                                        totalread=0;
                                }
                                else
                                {
                                        printf("接收到的字符为:%x\n",buffer);
                                        printf("fd is: %d\n",fd);
                                        printf("魔术字出错,还是包的判断算法出错?\n");
                                        totalread=0;
                                        continue;
                                }
                        }
                }
        }
}

[/PHP]
回复 支持 反对

使用道具 举报

发表于 2006-9-12 15:42:25 | 显示全部楼层
楼主是如何判断没有读到任何数据的?

我倒真的是没有考虑过假如没有程序打开串口进行读操作, 那么系统是否还会将接收到的数据保存以供后面的读取. 印象中似乎是会丢弃的. 这个实在记不清了, 手头也没有东西帮你实验, 哪位兄弟帮着纠正一下吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-9-13 15:28:44 | 显示全部楼层
谢谢DoDo的排版。
我是这样判断的(根据实际情况)
先打开硬件(串口),然后让该程序运行,接着重启硬件,结果程序就不能读到包了。
还有顺带请教 一下ioctl()的用法,当然希望可以给出一个比较详细的例子。

谢谢
回复 支持 反对

使用道具 举报

发表于 2006-9-13 20:12:41 | 显示全部楼层
ioctl 我也不太熟, 看一下 man 吧.
楼主所说的读不到包是指程序没有打印内容吗? 也许这是因为收到的数据量已经大于 MAGNUM 了. 不妨在 read 函数之后打印点提示信息来帮助调试
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-9-15 08:24:35 | 显示全部楼层
谢谢指点,上面那个问题我勉强说是算解决了吧,我就让他一次读取sizeof(unsigned int)个字符,结果似乎就好了,不过我觉得可能会存在隐患。不过暂时还没有找到更好的方法(其实我觉得完全可以一个字符一个字符读取或者将字符读取到一个缓冲中,然后再从缓冲中去取到MAG_NUM),不过我觉得比较麻烦了。我是一个比较菜的新手,如果大家觉得有更好的方法,我希望可以跟大家一起交流交流。
回复 支持 反对

使用道具 举报

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

本版积分规则

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