打印
[i.MX]

imx6q sabrelite 开发板,串口调试问题(已解决)

[复制链接]
5255|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
linz@imx|  楼主 | 2014-4-8 11:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 FSL_TICS_imx 于 2014-5-6 17:50 编辑

我用测试程序,mxc_uart_xmit_test.c  在执行时,读不到缓冲中的数据,程序如下:


#include <stdarg.h>
#include <termio.h>
#include <sys/timeb.h>
#include <pthread.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <signal.h>
#include <errno.h>
#include <stdlib.h>


#define DEFAULT_RATE 115200;

unsigned int get_time(void)
{
    struct timeb tb;
    unsigned int realNow;

    ( void ) ftime( &tb );

    realNow = (unsigned int )(((tb.time%4290) * 1000000 ) + ( tb.millitm * 1000 ));

    return(realNow);
}

static speed_t baudrate_map(unsigned long b)
{
    speed_t retval;

    switch(b)
    {
        case 110:
            retval = B110;
            break;

        case 300:
            retval = B300;
            break;

        case 1200:
            retval = B1200;
            break;

        case 2400:
            retval = B2400;
            break;

        case 4800:
            retval = B4800;
            break;

        case 9600:
            retval = B9600;
            break;

        case 19200:
            retval = B19200;
            break;

        case 38400:
            retval = B38400;
            break;

        case 57600:
            retval = B57600;
            break;

        case 115200:
            retval = B115200;
            break;

#ifdef B230400
        case 230400:
            retval = B230400;
            break;
#endif

#ifdef B460800
        case 460800:
            retval = B460800;
            break;
#endif

#ifdef B500000
        case 500000:
            retval = B500000;
            break;
#endif

#ifdef B576000
        case 576000:
            retval = B576000;
            break;
#endif

#ifdef B921600
        case 921600:
            retval = B921600;
            break;
#endif

#ifdef B1000000
        case 1000000:
            retval = B1000000;
            break;
#endif

#ifdef B1152000
        case 1152000:
            retval = B1152000;
            break;
#endif

#ifdef B1500000
        case 1500000:
            retval = B1500000;
            break;
#endif

#ifdef B2000000
        case 2000000:
            retval = B2000000;
            break;
#endif

#ifdef B2500000
        case 2500000:
            retval = B2500000;
            break;
#endif

#ifdef B3000000
        case 3000000:
            retval = B3000000;
            break;
#endif

#ifdef B3500000
        case 3500000:
            retval = B3500000;
            break;
#endif

#ifdef B4000000
        case 4000000:
            retval = B4000000;
            break;
#endif

        default:
            retval = 0;
            break;
    }

    return(retval);
}

int trun, rrun;
int fd;
int size = 10000;
unsigned int tcount, rcount;
FILE *furead;

void *Uartsend(void * threadParameter)
{
        int *tx;
        double speed;
        double time;
        tcount = 0;

        tx = malloc(size);
        memset(tx, 0x0f, size);
        while(trun) {
                sleep(1);
                tx[0] = 0x55;
                time = get_time();
                write(fd, tx, size);
                time = get_time() - time;
                speed = size * 8 / (time/1000000);
                tcount += size;
                printf("sent %d bytes with speed %fbps\n", size, speed);
        }
        free(tx);
        return 0;
}

void *Uartread(void * threadParameter)
{
        char *rx;
        int iores, iocount;
        rcount = 0;

        while(rrun) {
                iocount = 0;
                iores = ioctl(fd, FIONREAD, &iocount);[color=Red 返回的iocount的值为0 为什么呢?
                if(!iocount)
                        continue;
                rx = malloc(iocount);
                /* Read in and wrap around the list */
                iores = read(fd, rx, iocount);
                rcount += iores;
                fwrite(rx, 1, iores, furead);
                free(rx);
        }
        return 0;
}

static void print_usage(const char *pname)
{
        printf("Usage: %s device [-S] [-O] [-E] [-HW] [-B baudrate]"
               "\n\t'-S' for 2 stop bit"
               "\n\t'-O' for PARODD "
               "\n\t'-E' for PARENB"
               "\n\t'-HW' for HW flow control enable"
               "\n\t'-B baudrate' for different baudrate\n", pname);

}

int main(int argc, char *argv[])
{
        int i, ret;
        struct termios options;
        unsigned long baudrate = DEFAULT_RATE;
        char c = 0;
        pthread_t p_Uartsend, p_Uartread;
        void *thread_res;

        if (argc < 2 || strncmp(argv[1], "/dev/ttymxc0", 12)) {
                print_usage(argv[0]);
                return -1;
        }

        fd = open(argv[1], O_RDWR | O_NOCTTY);

        if (fd == -1) {
                printf("open_port: Unable to open serial port - %s", argv[1]);
                return -1;
        }

        fcntl(fd, F_SETFL, 0);

        tcgetattr(fd, &options);
        options.c_cflag &= ~CSTOPB;
        options.c_cflag &= ~CSIZE;
        options.c_cflag |= PARENB;
        options.c_cflag &= ~PARODD;
        options.c_cflag |= CS8;
        options.c_cflag &= ~CRTSCTS;

        options.c_lflag &= ~(ICANON | IEXTEN | ISIG | ECHO);
        options.c_oflag &= ~OPOST;
        options.c_iflag &= ~(ICRNL | INPCK | ISTRIP | IXON | BRKINT );

        options.c_cc[VMIN] = 1;
        options.c_cc[VTIME] = 0;

        options.c_cflag |= (CLOCAL | CREAD);
        for(i = 2; i < argc; i++) {
                if (!strcmp(argv, "-S")) {
                        options.c_cflag |= CSTOPB;
                        continue;
                }
                if (!strcmp(argv, "-O")) {
                        options.c_cflag |= PARODD;
                        options.c_cflag &= ~PARENB;
                        continue;
                }
                if (!strcmp(argv, "-E")) {
                        options.c_cflag &= ~PARODD;
                        options.c_cflag |= PARENB;
                        continue;
                }
                if (!strcmp(argv, "-HW")) {
                        options.c_cflag |= CRTSCTS;
                        continue;
                }
                if (!strcmp(argv, "-B")) {
                        i++;
                        baudrate = atoi(argv);
                        if(!baudrate_map(baudrate))
                                baudrate = DEFAULT_RATE;
                        continue;
                }
        }
        if(baudrate) {
                cfsetispeed(&options, baudrate_map(baudrate));
                cfsetospeed(&options, baudrate_map(baudrate));
        }
        tcsetattr(fd, TCSANOW, &options);
        printf("UART %lu, %dbit, %dstop, %s, HW flow %s\n", baudrate, 8,
               (options.c_cflag & CSTOPB) ? 2 : 1,
               (options.c_cflag & PARODD) ? "PARODD" : "PARENB",
               (options.c_cflag & CRTSCTS) ? "enabled" : "disabled");

        trun = 1;
        rrun = 1;
        furead = fopen("uart_read.txt","wb");

        ret = pthread_create(&p_Uartsend, NULL, Uartsend, NULL);
        if(ret < 0)
                goto error;
        ret = pthread_create(&p_Uartread, NULL, Uartread, NULL);
        if(ret < 0) {
                ret = pthread_join(p_Uartsend, &thread_res);
                goto error;
        }

        printf("test begin, press 'c' to exit\n");

        while(c != 'c'){
                c = getchar();
        }

        trun = 0;
        ret = pthread_join(p_Uartsend, &thread_res);
        if(ret < 0)
                printf("fail to stop Uartsend thread\n");
        printf("tcount=%d\n",tcount);
        i = 5;
        while((tcount > rcount) && i) {
                i--;
                sleep(1);
        }
        rrun = 0;
        ret = pthread_join(p_Uartread, &thread_res);
        if(ret < 0)
                printf("fail to stop Uartread thread\n");
        printf("rcount=%d\n",rcount);
error:
        fclose(furead);
        close(fd);
        printf("test exit\n");

        return 0;
}

相关帖子

沙发
FSL_TICS_ZJJ| | 2014-4-8 13:10 | 只看该作者
楼主你好,你的问题已经转交给我们的I.MX工程师,
他会回答你,请耐心等待。

使用特权

评论回复
板凳
FSL_TICS_Rita| | 2014-4-8 16:08 | 只看该作者
楼主你好,请问你是如何执行的?

使用特权

评论回复
地板
linz@imx|  楼主 | 2014-4-8 16:27 | 只看该作者
FSL_TICS_Rita 发表于 2014-4-8 16:08
楼主你好,请问你是如何执行的?

# ./mxc_uart_xmit_test /dev/ttymxc0

使用特权

评论回复
5
uwyyk28| | 2014-4-21 23:56 | 只看该作者
出现了跟楼主一样的问题,请问如何解决,谢谢!

使用特权

评论回复
6
alexer| | 2014-4-22 09:04 | 只看该作者
FSL_TICS_ZJJ 发表于 2014-4-8 13:10
楼主你好,你的问题已经转交给我们的I.MX工程师,
他会回答你,请耐心等待。 ...

你每次都是这么一句。我已经开始无视了。。。

使用特权

评论回复
7
FSL_TICS_ZJJ| | 2014-4-22 09:08 | 只看该作者
alexer 发表于 2014-4-22 09:04
你每次都是这么一句。我已经开始无视了。。。

三楼是不是已经开始回复?
他是I.MX工程师,是我把帖子发给他,他才过来的。
因为我们每天不止管论坛,所以只能有贴过来。
感谢你的谅解。

使用特权

评论回复
8
uwyyk28| | 2014-4-22 15:41 | 只看该作者
FSL_TICS_ZJJ 发表于 2014-4-22 09:08
三楼是不是已经开始回复?
他是I.MX工程师,是我把帖子发给他,他才过来的。
因为我们每天不止管论坛,所 ...

理解论坛的管理员和解答员,请帮助解决一下这个问题,谢谢

使用特权

评论回复
9
uwyyk28| | 2014-4-22 15:44 | 只看该作者
FSL_TICS_ZJJ 发表于 2014-4-22 09:08
三楼是不是已经开始回复?
他是I.MX工程师,是我把帖子发给他,他才过来的。
因为我们每天不止管论坛,所 ...

用的飞思卡尔 双核A9的板子,Marsboard,测试串口UART1,测试程序执行如下:

./mxc_uart_xmit_test /dev/ttymxc0

现象也是只能send线程发送数据,read线程不能接收,void *Uartread(void * threadParameter)线程里的iores = ioctl(fd, FIONREAD, &iocount);这句话,返回的iocount一直是0。

使用特权

评论回复
10
FSL_TICS_ZJJ| | 2014-4-22 15:57 | 只看该作者
uwyyk28 发表于 2014-4-22 15:44
用的飞思卡尔 双核A9的板子,Marsboard,测试串口UART1,测试程序执行如下:

./mxc_uart_xmit_test /dev ...

我是kinetis的工程师,不是I.MX的工程师,这个题我刚又帮你转了。

使用特权

评论回复
11
FSL_TICS_Rita| | 2014-4-22 17:32 | 只看该作者
uwyyk28 发表于 2014-4-22 15:44
用的飞思卡尔 双核A9的板子,Marsboard,测试串口UART1,测试程序执行如下:

./mxc_uart_xmit_test /dev ...

你好,请问你是如何测试的呢?我在我这边帮你重现试一下。

使用特权

评论回复
12
uwyyk28| | 2014-4-22 20:43 | 只看该作者
FSL_TICS_Rita 发表于 2014-4-22 17:32
你好,请问你是如何测试的呢?我在我这边帮你重现试一下。

我在测试Uart1,设备节点/dev/ttymxc0,测试命令如下:

$ ./mxc_uart_xmit_test /dev/ttymxc0 -B 9600

显示是每隔几秒钟就打印
send 10000 bytes with speed xxx

我在Uartread函数里加上了打印接收的rcount,但没有打印出来信息,后经过调试,发现在Uartread函数中的 iores = ioctl(fd, FIONREAD, &iocount);函数返回的iocount是0,所以Uartread函数一直没有执行到打印语句那里,我也在看驱动是否有问题,请技术人员帮忙复现一下,并帮助调试一下这个问题,谢谢!

使用特权

评论回复
13
uwyyk| | 2014-4-26 14:19 | 只看该作者
uwyyk28 发表于 2014-4-22 20:43
我在测试Uart1,设备节点/dev/ttymxc0,测试命令如下:

$ ./mxc_uart_xmit_test /dev/ttymxc0 -B 9600

解决了
1. 硬件方面,由于大意,接错了,使用usb转ttl,硬件搞定
2. 软件方面,board-mx6q_marsboard.c的mx6q_marsboard_pads的uart1配置错了,应该是
   MX6Q_PAD_CSI0_DAT10__UART1_TXD,
   MX6Q_PAD_CSI0_DAT11__UART1_RXD,

   之前使用的是默认的
   MX6Q_PAD_SD3_DAT7__UART1_TXD,
   MX6Q_PAD_SD3_DAT6__UART1_RXD,

   修改后uart1,3,4都可以正常收发。

使用特权

评论回复
14
uwyyk28| | 2014-4-26 14:21 | 只看该作者
uwyyk28 发表于 2014-4-22 20:43
我在测试Uart1,设备节点/dev/ttymxc0,测试命令如下:

$ ./mxc_uart_xmit_test /dev/ttymxc0 -B 9600

解决了
1. 硬件方面,由于大意,接错了,使用usb转ttl,硬件搞定
2. 软件方面,board-mx6q_marsboard.c的mx6q_marsboard_pads的uart1配置错了,应该是
   MX6Q_PAD_CSI0_DAT10__UART1_TXD,
   MX6Q_PAD_CSI0_DAT11__UART1_RXD,

   之前使用的是默认的
   MX6Q_PAD_SD3_DAT7__UART1_TXD,
   MX6Q_PAD_SD3_DAT6__UART1_RXD,

   修改后uart1,3,4都可以正常收发。

使用特权

评论回复
15
FSL_TICS_Rita| | 2014-4-28 11:18 | 只看该作者
uwyyk28 发表于 2014-4-26 14:21
解决了
1. 硬件方面,由于大意,接错了,使用usb转ttl,硬件搞定
2. 软件方面,board-mx6q_marsboard.c的 ...

你好,问题解决了就好,并且非常感谢分享解决办法给大家~~欢迎有问题继续在本论坛中交流和学习:)。

使用特权

评论回复
16
FSL_TICS_imx| | 2014-5-6 17:47 | 只看该作者
楼主你好,如果你的问题已经解决,麻烦把该贴结了,非常感谢,如果还有问题欢迎继续在这里讨论~~

使用特权

评论回复
17
jackyweijie| | 2016-10-25 16:51 | 只看该作者
我测的也是read线程收不到数据啊,sabresad imx6的开发板。
班级配置里面就是配的:
MX6Q_PAD_CSI0_DAT10__UART1_TXD,
MX6Q_PAD_CSI0_DAT11__UART1_RXD,
这和半双工与全双工有关系吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

95

帖子

0

粉丝