免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 5975 | 回复: 21
打印 上一主题 下一主题

[C] linux多线程问题求助!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-03-11 11:37 |只看该作者 |倒序浏览
10可用积分
本帖最后由 js001sdx 于 2010-03-12 11:42 编辑

第一次做线程!现在遇到如下问题!!请各位赐教!!不生感激!!
我在主函数里做了三个线程!!分别是显示和按键、存储、串口收发!!
如下:
int main(int argc, char **argv)
{
    int fd,fd3;
    int i;
    pthread_t thread1, thread2, thread3;
    //初始化部分
   fd = open("/dev/hgo", O_RDWR);
    if (fd < 0)
       {
        printf("open hgo device error00! %d\n", fd);
       }
    ioctl(fd, 0,10);
    ioctl(fd, 1, 5);
    close(fd);

            result0=pthread_create(&thread1, NULL, (void *)task1,NULL);
            if(result0)
                {
                    perror("pthread_create: task1.\n");
                    exit(0);
                }
            result0=pthread_create(&thread2, NULL, (void *)task2,NULL);
            if(result0)
                {
                    perror("pthread_create: task2.\n");
                    exit(0);
                }
            result0=pthread_create(&thread3, NULL, (void *)task3,NULL);
            if(result0)
                {
                    perror("pthread_create: task3.\n");
                    exit(0);
                }
            pthread_join(thread3, NULL);
            pthread_join(thread2, NULL);
            pthread_join(thread1, NULL);
}
void task1()
{
     while(1)
        {
          usleep(1000*30);
          显示和按键的处理程序。
        }
}
void task2()
{
     while(1)
        {
           usleep(1000*50);
           存储部分代码。
        }
}
void task3()
{
     while(1)
        {
           usleep(1000*30);
           串口收发代码,这里要说明一下:我的串口外面接了485的片子,所以采用了485通信方式,传输的代码量有点大,我单独跑了一下,把所有的命令收发一边大约需要10分钟。
        }
现在的问题是:
1:加入线程后,我的串口收回来的数据总是错误!!一般都是丢掉了数据串的前几个字符!!(单独把串口收发做子程序是正常的)
2:整个程序跑起来后,过一段时间串口收发那个线程好像会停止不运行了!!
我把我的串口部分主要代码也贴一下:

   fd1 = open(SERIAL1,   O_RDWR);//O_RDWR|O_NONBLOCK);//打开串口
    if (fd1 < 0)
        {
            printf("open serial 1 error! %d\n", fd1);
        }
    set_speed(fd1, 2400);
    set_other_attribute(fd1, 8, 1, 'e');//设置串口

    fd0 = open("/dev/485_IO", O_RDWR);//打开485使能引脚驱动
    if (fd0 < 0)
        {
            printf("open 485_IO error! %d\n", fd0);
        }

      ioctl(fd0, 0,0);//485使能置高
      i = write(fd1, temp, 16);//向串口发命令
    usleep(1000*80);

       i=0;
      ioctl(fd0, 1,0);//485使能置低
    while(nread=read(fd1, test+i, 1)>0)//读串口数据
       {
                   if(*(test+i)==0x16)
             {
                end=i;
                break;
             }
          i++;
           }
        for(i=0;i<end;i++)
        {
              printf("-%x-",*(test+i));
        }
        printf("\n");

}

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
2 [报告]
发表于 2010-03-11 12:36 |只看该作者
是不是产生了信号

捕获信号看看

论坛徽章:
4
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11IT运维版块每日发帖之星
日期:2016-08-11 06:20:00IT运维版块每日发帖之星
日期:2016-08-15 06:20:00
3 [报告]
发表于 2010-03-11 12:48 |只看该作者
test是如何定义的呢?
是个char数组吧?空间够大么?

论坛徽章:
0
4 [报告]
发表于 2010-03-11 13:31 |只看该作者
test是如何定义的呢?
是个char数组吧?空间够大么?
test是指针!!分配的空间肯定够用!

论坛徽章:
0
5 [报告]
发表于 2010-03-11 13:32 |只看该作者
回复 2# chenzhanyiczy


    没有明白你的意思啊!!

论坛徽章:
4
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11IT运维版块每日发帖之星
日期:2016-08-11 06:20:00IT运维版块每日发帖之星
日期:2016-08-15 06:20:00
6 [报告]
发表于 2010-03-11 14:00 |只看该作者
nread=read(fd1, test, 1);//读串口数据

都读到test的第一个字符中?
另外,没有判断read的返回值。

论坛徽章:
0
7 [报告]
发表于 2010-03-11 14:05 |只看该作者
回复 6# happy_fish100


    nread=read(fd1, test, 1);//读串口数据
这个应该是抄上来的时候抄错了
原来是这样:
nread=read(fd1, test+i, 1);//读串口数据
另外,不判断nread会影响读到的数据吗?

论坛徽章:
4
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11IT运维版块每日发帖之星
日期:2016-08-11 06:20:00IT运维版块每日发帖之星
日期:2016-08-15 06:20:00
8 [报告]
发表于 2010-03-11 14:35 |只看该作者
回复 7# js001sdx

是的。必须判断read函数的返回值。
-1表示错误,0表示流关闭或已结束。
> 0表示成功。

论坛徽章:
0
9 [报告]
发表于 2010-03-11 15:03 |只看该作者
以前做个一个类似的项目,LED,LCD,KEYBOARD,GPIO,RS232
1,丢数据的可能原因:
  一,线程调度有问题,并且串口的模式设置[1]不合理,造成数据丢失;
  二 串口设置的速率太快,对端处理不过来,干扰,造成数据校验失败;
2,线程死锁;
  估计是调度方式不对吧,

论坛徽章:
0
10 [报告]
发表于 2010-03-11 15:04 |只看该作者
回复  happy_fish100


    nread=read(fd1, test, 1);//读串口数据
这个应该是抄上来的时候抄错了
原 ...
js001sdx 发表于 2010/03/11 14:05



    会,比较保险的做法是,处理读取到了多少个有效字符
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP