4981|15

56

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

大家好,请问一个关于串口的问题 [复制链接]

我现在写好了串口驱动,测试的时候发现问题,但是不知道是什么原因,串口只能写不能读
代码如下....
输出是
test uart
com1 open ok
in ComWrite()
com write ABCD.... ok
in ComRead()
com write ABCD.... ok
com write ABCD.... ok
com write ABCD.... ok
com write ABCD.... ok
com write ABCD.... ok

大家能帮我找找问题吗??谢谢!!!


#include
#include "taskLib.h"
#include "locale.h"
#include "string.h"
#include "stdlib.h"
#include "Vxworks.h"
#include "configAll.h"
#include "dosFsLib.h"
#include "sioLib.h"

typedef unsigned char BYTE;
int comfd;



/*

*/

int ComPortInit(void)

{
        int sccfd;
        unsigned char str[10];

               
        ttyDrv();
        ttyDevCreate("/tyCo/1",sysSerialChanGet(l),512,512);      
        sccfd="open"("/tyCo/1",O_RDWR);
        if(sccfd<0)
        {
                logMsg("com 1 open        failed\n",0,0,0,0,0,0);
                return(ERROR);
        }
        else

        {
                logMsg("com 1 open        OK\n",0,0,0,0,0,0);
                ioctl(sccfd,FIOBAUDRATE,9600);
                ioctl(sccfd,FIOSETOPTIONS,OPT_RAW);
        }
        return 0;
}



int ComWrite(int comid)

{
        unsigned char sendbuf[20];
        unsigned char sendlen=20;
        unsigned char tempi;      

        logMsg("in ComWrite()\n",0,0,0,0,0,0);
        for(tempi=0;tempi<20;tempi++)sendbuf[tempi]=65+tempi;
        sendbuf[19]='\0';      

        while(1)
        {
                if((write(comid,sendbuf,sendlen))==ERROR)
                {
                        logMsg("com write EEROR\n",0,0,0,0,0,0);
                }
                else
                {
                        logMsg("com write %s OK\n",sendbuf,0,0,0,0,0);
                }
               taskDelay(60);
        }
}



int ComRead(int comid)
{
        unsigned char readbuf[50];
        unsigned char readlen=0;
        unsigned char tempi;
        unsigned char buf[10];
     
        fd_set rfds;
        logMsg("in ComRead()\n",0,0,0,0,0,0);
        /*for(tempi=0;tempi<20;tempi++)readbuf[tempi]=0x32;

        readbuf[19]='\0';*/
  
        while(1)
        {
                FD_ZERO(&rfds);
                FD_SET(comid,&rfds);            
                if(select(comid+1,&rfds,NULL,NULL,NULL)< 0 )
                {
                        logMsg("select error,quit Writing\n",0,0,0,0,0,0);
                }         
                if( FD_ISSET(comid,&rfds))
                {
                        if(read(comid,buf,1)==ERROR)
                        {
                                logMsg("com read EEROR\n",0,0,0,0,0,0);
                        }
                        else
                        {
                                readbuf[readlen]=buf[0];
                                readlen++;
                                readbuf[readlen]='\0';
                                logMsg("com read %s OK\n",readbuf,0,0,0,0,0);
                                readlen=0;
                        }
                }               
        }
}

int testUart()
{
        logMsg("testUart\n");
        comfd=ComPortInit();
        if(comfd<0)
        {
                logMsg("init comport error\n",0,0,0,0,0);
        }
        else
        {
                taskSpawn ("COMSend", 100, 0, 4096, (FUNCPTR)ComWrite,comfd, 0, 0, 0, 0, 0, 0, 0, 0, 0);
                taskSpawn ("COMRecv", 100, 0, 4096, (FUNCPTR) ComRead,comfd, 0, 0, 0, 0, 0, 0, 0, 0, 0);
        }

}

最新回复

select 那几句的问题,我也正弄呢... 还没搞定呢   详情 回复 发表于 2008-8-1 10:31
点赞 关注

回复
举报

83

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
int ComPortInit(void)

{
        int sccfd;
        unsigned char str[10];

               
        ttyDrv();
        ttyDevCreate("/tyCo/1",sysSerialChanGet(l),512,512);        
        sccfd="open"("/tyCo/1",O_RDWR);
        if(sccfd <0)
        {
                logMsg("com 1 open        failed\n",0,0,0,0,0,0);
                return(ERROR);
        }
        else

        {
                logMsg("com 1 open        OK\n",0,0,0,0,0,0);
                ioctl(sccfd,FIOBAUDRATE,9600);
                ioctl(sccfd,FIOSETOPTIONS,OPT_RAW);
        }
        return 0;                   // 这个地方错了,应该return sccfd不是return 0
}
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
呵呵 sorry 那是笔误
原来的程序 比较罗嗦 比如有设置停止位之类的
我把那些功能删除了再发上来
可能是删除的时候 不小心删除了
sorry
原来的程序是正确的,不是return 0,是return sccfd
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

4
 
自己顶
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

5
 
串口读写应该是双工的吧,写满BUFFER之后就读出来,判断标志位,是否读完,再继续往里面写.
这样一直循环到把你的所有数据都写完.不可以一直不停的只管往里面写数据.
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用 4 楼 yujianhuabcde 的回复:
串口读写应该是双工的吧,写满BUFFER之后就读出来,判断标志位,是否读完,再继续往里面写.
这样一直循环到把你的所有数据都写完.不可以一直不停的只管往里面写数据.

那么请问已经如何修改代码呢?
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

7
 
楼主其他的代码都正确吗??
如果没问题的话,给个最简单的测试方法。。。

  1. int ComRead(int comid)
  2. {
  3.         unsigned char readbuf[50];
  4.         unsigned char readlen=0;
  5.         unsigned char tempi;
  6.         unsigned char buf[10];
  7.       
  8.         fd_set rfds;
  9.         logMsg("in ComRead()\n",0,0,0,0,0,0);    // 这句打印了,说明有运行这段代码
  10.         /*for(tempi=0;tempi <20;tempi++)readbuf[tempi]=0x32;

  11.         readbuf[19]='\0';*/
  12.    
  13.         while(1)
  14.         {
  15.                 FD_ZERO(&rfds);
  16.                 FD_SET(comid,&rfds);   
  17.                 logMsg("111111111111\n",0,0,0,0,0,0);          // 增加此处打印语句
  18.                 if(select(comid+1,&rfds,NULL,NULL,NULL) < 0 )
  19.                 {
  20.                         logMsg("select error,quit Writing\n",0,0,0,0,0,0); // 这句没打,待定
  21.                 }           
  22.                 if( FD_ISSET(comid,&rfds))
  23.                 {
  24.                         if(read(comid,buf,1)==ERROR)
  25.                         {
  26.                                 logMsg("com read EEROR\n",0,0,0,0,0,0);    // 这句没打,待定
  27.                         }
  28.                         else
  29.                         {
  30.                                 readbuf[readlen]=buf[0];
  31.                                 readlen++;
  32.                                 readbuf[readlen]='\0';
  33.                                 logMsg("com read %s OK\n",readbuf,0,0,0,0,0);  // 这句没打,待定
  34.                                 readlen=0;
  35.                         }
  36.                 }
  37.                 else
  38.                 {
  39.                         logMsg("2222222\n",0,0,0,0,0,0);          // 增加此处打印语句
  40.                 }               
  41.         }
  42. }
复制代码

运行一下看打印结果就知道了
估计就是select前后的那几句代码有问题
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

8
 
你的select的参数timeout写完整一点,直接写NULL可能有问题的
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

9
 
最好把真实用的代码帖出来,否则谁知道哪个小地方错了呢
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

10
 
引用 8 楼 frank_zhou 的回复:
最好把真实用的代码帖出来,否则谁知道哪个小地方错了呢

ok


#include
#include "taskLib.h"
#include "locale.h"
#include "string.h"
#include "stdlib.h"
#include "Vxworks.h"
#include "configAll.h"
#include "dosFsLib.h"
#include "sioLib.h"


/*UART mode set*/
#define SIO_STOPBIT_SET   0x1020
#define SIO_CHARLGH_SET   0x1021
#define SIO_PTYODD_SET    0x1024
#define SIO_PTYEVE_SET    0x1025

typedef unsigned char BYTE;

int comfd;

/*
*/
int ComPortInit(int portid,int baudrate,int stopBitLength,int dataLength,int odd_even_none)
{
        int sccfd;
        int errorflag = 0;
        unsigned char str[10];
               
        if(portid<1||portid>4)
        {
                logMsg("Com%d is not existed\n",portid,0,0,0,0,0);
                return(ERROR);
        }

        if(baudrate!=300&&baudrate!=600&&baudrate!=1200&&
                baudrate!=2400&&baudrate!=4800&&baudrate!=9600&&
                baudrate!=19200&&baudrate!=38400&&baudrate!=43000&&
                baudrate!=56000&&baudrate!=57600&&baudrate!=115200&&baudrate!=0)
        {
                logMsg("invalid baudrate\n",0,0,0,0,0,0);
                return(ERROR);
        }

        if(stopBitLength!=1&&stopBitLength!=2&&stopBitLength!=0)
        {
                logMsg("invalid stopbit length\n",0,0,0,0,0,0);
                return(ERROR);
        }
       
        if(dataLength!=6&&dataLength!=7&&dataLength!=8&&dataLength!=0)
        {
                logMsg("invalid data length\n",0,0,0,0,0,0);
                return(ERROR);
        }
       
        if(odd_even_none!=1&&odd_even_none!=2&&odd_even_none!=0)
        {
                logMsg("invalid odd even or none verify\n",0,0,0,0,0,0);
                return(ERROR);
        }
/**       
        m8270_sccuart_drv(portid);
        errorflag=m8270_sccuart_create(portid) ;
        **/
        /**
        把串口驱动程序添加到系统中
        **/
        ttyDrv();     
        /**
        下面语句把串口 com2添加到系统中," tyC0/l"是设备名,sysSerialChanGet(1)       
        用来获得指向串口描述符的指针,后面两个参数定义了读缓冲区和写缓冲区的大小
        **/
        ttyDevCreate("/tyCo/1",sysSerialChanGet(1),100,100);
       
        if(errorflag== 0)
        {
                logMsg("Com%d init OK\n",portid,0,0,0,0,0);
               
                sccfd=open("/tyCo/1",O_RDWR,0);
                if(sccfd<0)
                {
                        logMsg("com%d open        failed\n",portid,0,0,0,0,0);
                        return(ERROR);
                }
                else
                {
                        logMsg("com%d open        OK\n",portid,0,0,0,0,0);
                       
                        ioctl(sccfd,FIOSETOPTIONS,OPT_RAW);
                        ioctl(sccfd,FIOFLUSH,0);
                        if(baudrate!=0)
                        {
                                ioctl(sccfd,SIO_BAUD_SET,baudrate);
                        }
                /**       
                        if(stopBitLength!=0)
                        {
                                ioctl(sccfd,SIO_STOPBIT_SET,stopBitLength);
                        }

                        if(dataLength!=0)
                        {
                                ioctl(sccfd,SIO_CHARLGH_SET,dataLength);
                        }

                        switch(odd_even_none)
                        {
                                case 1:
                                        ioctl(sccfd,SIO_PTYODD_SET,0);
                                        break;
                                case 2:
                                        ioctl(sccfd,SIO_PTYEVE_SET,0);
                                        break;
                                default:
                                        break;
                        }
                **/       
                        return(sccfd);
                }
        }
        else
        {
                logMsg("Com%d init failed\n",portid,0,0,0,0,0);
                return(ERROR);
        }       


}

int ComWrite(int comid)
{
        unsigned char sendbuf[20];
        unsigned char sendlen=20;
        unsigned char tempi;
       
        logMsg("in ComWrite()\n",0,0,0,0,0,0);

        for(tempi=0;tempi<20;tempi++)sendbuf[tempi]=65+tempi;
        sendbuf[19]='\0';
       
        while(1)
        {
                if((write(comid,sendbuf,sendlen))==ERROR)
                {
                        logMsg("com write EEROR\n",0,0,0,0,0,0);
                }
                else
                {
                        logMsg("com write %s OK\n",sendbuf,0,0,0,0,0);
                }
                taskDelay(60);
        }
}

int ComRead(int comid)
{
        unsigned char readbuf[50];
        unsigned char readlen=0;
        unsigned char tempi;
        unsigned char buf[10];
       
        fd_set rfds;

        logMsg("in ComRead()\n",0,0,0,0,0,0);

        /*for(tempi=0;tempi<20;tempi++)readbuf[tempi]=0x32;
        readbuf[19]='\0';*/
       
        while(1)
        {
                FD_ZERO(&rfds);
               
                FD_SET(comid,&rfds);
               
                if(select(comid+1,&rfds,NULL,NULL,NULL)< 0 )
                {
                        logMsg("select error,quit Writing\n",0,0,0,0,0,0);
                }
                logMsg("in ComRead 1\n",0,0,0,0,0,0);
               
                if( FD_ISSET(comid,&rfds))
                {
                        if(read(comid,buf,1)==ERROR)
                        {
                                logMsg("com read EEROR\n",0,0,0,0,0,0);
                        }
                        else
                        {
                                logMsg("in ComRead 2\n",0,0,0,0,0,0);
                                readbuf[readlen]=buf[0];
                                readlen++;
                                /**
                                if(buf[0]=='A')
                                {
                                }
                                **/
                                        readbuf[readlen]='\0';
                                        logMsg("com read %s OK\n",readbuf,0,0,0,0,0);
                                        readlen=0;
                        }
                }
                else
                        logMsg("in ComRead 0\n",0,0,0,0,0,0);
                                       
        }
}


int testUart()
{
        logMsg("testUart\n");
        comfd=ComPortInit(1,19200,1, 8, 0);
        if(comfd<0)
        {
                logMsg("init comport error\n",0,0,0,0,0);
        }
        else
        {
                taskSpawn ("COMSend", 100, 0, 4096, (FUNCPTR)ComWrite,comfd, 0, 0, 0, 0, 0, 0, 0, 0, 0);
                taskSpawn ("COMRecv", 100, 0, 4096, (FUNCPTR) ComRead,comfd, 0, 0, 0, 0, 0, 0, 0, 0, 0);
        }
}

 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

11
 
--! 怎么用写字板没有了缩进那么恶心啊
唉 这台机子没有VIM 大家将就点吧
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

12
 
贴代码的时候用“插入源码”功能(回复)就可以格式化代码了。
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

13
 
你的BUFFER有多大?你就先发送这么大小的字节数,再读一次这么大小的字节数.再循环N次,直到发送完你需要的大小.
我不会上层的函数,我看过的是最基本的函数,所以不会改代码.我也不清楚这样可不可以,你试试好了.
for(i=0,i {
taskSpawn ("COMSend", ?, 0, ?, (FUNCPTR)ComWrite,comfd, 0, 0, 0, 0, 0, 0, 0, 0, 0);
taskSpawn ("COMRecv", ?, 0, ?, (FUNCPTR) ComRead,comfd, 0, 0, 0, 0, 0, 0, 0, 0, 0);
}
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

14
 
有问题请先GOOGLE,BAIDU
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

15
 
等待牛人来答.
 
 
 

回复

91

帖子

0

TA的资源

一粒金砂(初级)

16
 
select 那几句的问题,我也正弄呢...
还没搞定呢
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表