天嵌 ARM开发社区

 找回密码
 注册
查看: 8884|回复: 17

tq2440串口问题

[复制链接]
小汪 发表于 2012-4-27 11:12:50 | 显示全部楼层 |阅读模式
我是tq2440开发板的用户,我发现串口1有点问题,发送的数据跟接收的数据会有些不同 比如我发送0x00---0xff 收到的数据如下 00 01 02 03 04 05 06 07 08 09 0d 0a 0b 0c 0a 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 60 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 7b 7c 7d 7e 7f 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de bf c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf d0 d1 d2 d3 d4 d5 d6 f7 d8 d9 da db dc dd de df  比较明显的一点就是大小写全部转换成大写
 楼主| 小汪 发表于 2012-4-27 11:29:10 | 显示全部楼层
:'(:'(:'(:'(:'(:'(:'(:'(:'(
TQ_guoxixiao 发表于 2012-4-27 11:39:07 | 显示全部楼层
大小写全部转换成大写
请详细解释一下。
 楼主| 小汪 发表于 2012-4-27 11:52:03 | 显示全部楼层
TQ_guoxixiao 发表于 2012-4-27 11:39
大小写全部转换成大写
请详细解释一下。

我昨天 试验 发送 小写a--f  和大写 A--F  但是收到的全部是 大写A--F
不只是字母部分的ascii码有问题,其他的也有有问题的,就是发送跟接收不一样,我把接收的结果都贴出来了
TQ_guoxixiao 发表于 2012-4-27 11:58:51 | 显示全部楼层
小汪 发表于 2012-4-27 11:52
我昨天 试验 发送 小写a--f  和大写 A--F  但是收到的全部是 大写A--F
不只是字母部分的ascii码有问题, ...

用的什么应用程序?
 楼主| 小汪 发表于 2012-4-27 12:02:39 | 显示全部楼层
TQ_guoxixiao 发表于 2012-4-27 11:58
用的什么应用程序?

天嵌给的串口测试程序,我只改了下发送数据
TQ_guoxixiao 发表于 2012-4-27 12:03:59 | 显示全部楼层
程序名字叫什么?
能否截图程序运行的界面?
 楼主| 小汪 发表于 2012-4-27 12:18:23 | 显示全部楼层
TQ_guoxixiao 发表于 2012-4-27 12:03
程序名字叫什么?
能否截图程序运行的界面?

[root@CHEN /opt]# ./serial_test
readserailcfg
serialread.dev is /dev/tq2440_serial1
serialread.speed is 115200
serialread.databits is 8
serialread.stopbits is 1
serialread.parity is N
isatty success!
nwrite=56
^C
[root@CHEN /opt]#
这是收到的ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ!
我发送的abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ!
额,我不会传图片
TQ_guoxixiao 发表于 2012-4-27 15:00:04 | 显示全部楼层
小汪 发表于 2012-4-27 12:02
天嵌给的串口测试程序,我只改了下发送数据

问题可能就是因为:只改了下发送数据
两个方法:
1、把代码贴出来,大家帮你分析
2、用pda系统的串口测试程序(tqpda)。
 楼主| 小汪 发表于 2012-4-27 15:17:29 | 显示全部楼层
TQ_guoxixiao 发表于 2012-4-27 15:00
问题可能就是因为:只改了下发送数据
两个方法:
1、把代码贴出来,大家帮你分析

我从光盘里拷贝的应用程序直接下载运行这是输出结果HELLO,TQ2440!   
这是程序定义  char buff2[] = "hello,TQ2440!\n";
 楼主| 小汪 发表于 2012-4-27 15:26:59 | 显示全部楼层
/***********************************
** 天嵌科技串口测试程序
** 作者:黄健
** 版权:广州天嵌计算机科技有限公司
** 日期:2009年4月24日编写
***********************************/

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <errno.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include"pthread.h"

#include "serial_test.h"


struct serial_config serialread;

static int serial_fd,beep_fd;

int speed_arr[] = {B230400, B115200, B57600, B38400, B19200, B9600, B4800, B2400, B1200, B300,
                   B38400, B19200, B9600, B4800, B2400, B1200, B300};

int name_arr[] = {230400, 115200, 57600, 38400, 19200, 9600, 4800, 2400, 1200, 300,
                  38400, 19200, 9600, 4800, 2400, 1200, 300};

//-----------------------------------------------
//打印配置文件tq2440_serial.cfg的内容
//-----------------------------------------------
void print_serialread()
{
        printf("serialread.dev is %s\n",serialread.serial_dev);
        printf("serialread.speed is %d\n",serialread.serial_speed);
        printf("serialread.databits is %d\n",serialread.databits);
        printf("serialread.stopbits is %d\n",serialread.stopbits);
        printf("serialread.parity is %c\n",serialread.parity);
}

//-----------------------------------------------
//读取tq2440_serial.cfg文件并进行配置
//-----------------------------------------------
void readserialcfg()
{
        FILE *serial_fp;
        char j[10];
       
        printf("readserailcfg\n");

        serial_fp = fopen("/etc/tq2440_serial.cfg","r");
        if(NULL == serial_fp)
        {
                printf("can't open /etc/tq2440_serial.cfg");
        }
        else
        {
                fscanf(serial_fp, "DEV=%s\n", serialread.serial_dev);

                fscanf(serial_fp, "SPEED=%s\n", j);
                serialread.serial_speed = atoi(j);

                fscanf(serial_fp, "DATABITS=%s\n", j);
                serialread.databits = atoi(j);

                fscanf(serial_fp, "STOPBITS=%s\n", j);
                serialread.stopbits = atoi(j);

                fscanf(serial_fp, "PARITY=%s\n", j);
                serialread.parity = j[0];
        }

        fclose(serial_fp);
}

//-----------------------------------------------
//设置波特率
//-----------------------------------------------
void set_speed(int fd)
{
        int i;
        int status;
        struct termios Opt;
        struct termios oldOpt;
        tcgetattr(fd, &oldOpt);
//        printf("serialread.speed is %d\n",serialread.serial_speed);
        for( i = 0; i < sizeof(speed_arr)/sizeof(int); i++)
        {
                if(serialread.serial_speed == name_arr[i])
                {
                        tcflush(fd, TCIOFLUSH);
                        cfsetispeed(&Opt, speed_arr[i]);
                        cfsetospeed(&Opt, speed_arr[i]);
                        status = tcsetattr(fd, TCSANOW, &Opt);
                        if(status != 0)
                        {
                                perror("tcsetattr fd1");
                                return;
                        }
                        tcflush(fd, TCIOFLUSH);
                }
        }
}


//-----------------------------------------------
//设置其他参数
//-----------------------------------------------
int set_Parity(int fd)
{
        struct termios options;
        struct termios oldoptions;
        if(tcgetattr(fd, &oldoptions) != 0)
        {
                perror("SetupSerial 1");
                return(FALSE);
        }

        options.c_cflag |= (CLOCAL|CREAD);
        options.c_cflag &=~CSIZE;
//        printf("serialread.databits is %d\n",serialread.databits);
        switch(serialread.databits)
        {
                case 7:
                        options.c_cflag |= CS7;
                        break;
                case 8:
                        options.c_cflag |= CS8;
                        break;
                default:
                        options.c_cflag |= CS8;
                        fprintf(stderr, "Unsupported data size\n");
                        return(FALSE);
        }
//        printf("serialread.parity is %c\n",serialread.parity);
        switch(serialread.parity)
        {
                case 'n':
                case 'N':
                        options.c_cflag &= ~PARENB;
                        options.c_iflag &= ~INPCK;
                        break;
                case 'o':
                case 'O':
                        options.c_cflag |= (PARODD | PARENB);
                        options.c_iflag |= INPCK;
                        break;
                case 'e':
                case 'E':
                        options.c_cflag |= PARENB;
                        options.c_cflag &= ~PARODD;
                        options.c_iflag |= INPCK;
                        break;
                default:
                        options.c_cflag &= ~PARENB;
                        options.c_iflag &= ~INPCK;
                        fprintf(stderr, "Unsupported parity\n");
                        return(FALSE);
        }
//        printf("serialread.stopbits is %d\n",serialread.stopbits);
        switch(serialread.stopbits)
        {
                case 1:
                        options.c_cflag &= ~CSTOPB;
                        break;
                case 2:
                        options.c_cflag |= CSTOPB;
                        break;
                default:
                        options.c_cflag &= ~CSTOPB;
                        fprintf(stderr, "Unsupported stop bits\n");
                        return(FALSE);
        }
        if(serialread.parity != 'n')
                options.c_iflag |= INPCK;
        options.c_cc[VTIME] = 0;        //150;                        //15 seconds
        options.c_cc[VMIN] = 0;
#if 1
        options.c_iflag |= IGNPAR|ICRNL;
        options.c_oflag |= OPOST;
        options.c_iflag &= ~(IXON|IXOFF|IXANY);                     
#endif
        tcflush(fd, TCIFLUSH);
        if(tcsetattr(fd, TCSANOW, &options) != 0)
        {
                perror("SetupSerial 3");
                return(FALSE);
        }
        return(TRUE);
}

//-----------------------------------------------
//打开串口设备
//-----------------------------------------------
int OpenDev(char *Dev)
{
        int fd = open(Dev, O_RDWR, 0);
        if(-1 == fd)
        {
                perror("Can't Open Serial Port");
                return -1;
        }
        else
                return fd;
}

//--------------------------------------------------
//串口初始化
//--------------------------------------------------
void serial_init(void)
{
        char *Dev;

        int i;

        readserialcfg();
        print_serialread();

        Dev = serialread.serial_dev;
        //打开串口设备
        serial_fd = OpenDev(Dev);

        if(serial_fd > 0)
                set_speed(serial_fd);                //设置波特率
        else
        {
                printf("Can't Open Serial Port!\n");
                exit(0);
        }
        //恢复串口未阻塞状态
        if (fcntl(serial_fd, F_SETFL, O_NONBLOCK) < 0)
        {
                printf("fcntl failed!\n");
                exit(0);
        }
        //检查是否是终端设备
#if 1        //如果屏蔽下面这段代码,在串口输入时不会有回显的情况,调用下面这段代码时会出现回显现象。
        if(isatty(STDIN_FILENO)==0)
        {
                printf("standard input is not a terminal device\n");
        }
        else
                printf("isatty success!\n");
#endif
        //设置串口参数
        if(set_Parity(serial_fd) == FALSE)
        {
                printf("Set parity Error\n");
                exit(1);
        }

}

void serial_rw()
{
        int i;
        char buff[512];
        char buff2[] = "abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ!\n";
        int nread,nwrite;

        nwrite = write(serial_fd,buff2,sizeof(buff2));
        printf("nwrite=%d\n",nwrite);
        while(1)
        {
                if((nread = read(serial_fd,buff,512))>0)
                {
                        buff[nread] = '\0';
#if 0        //调用这段代码可以实现回显,如果配合上面的回显,就会出现回显两次的情况。
                        write(serial_fd,buff,nread);
#endif
                        printf("\nrecv:%d\n",nread);
#if 0
                        for(i=0;i<nread;i++)
                        {
                                printf("%c",buff[i]);
                        }
                        printf("\n");
#else
                        printf("%s",buff);
                        printf("\n");
#endif
                }
        }

        close(serial_fd);

}

int main(int argc, char **argv)
{
        serial_init();

        serial_rw();       
        return 0;
//        close(serialread.serial_dev);
//        serial_test(telnum, telmoney);
}


这是我的程序,就是天嵌测试程序 改了输出数组
 楼主| 小汪 发表于 2012-4-27 17:11:34 | 显示全部楼层
我发现串口0 用测试程序测试 输出跟串口1一个现象,也是有发送数据和接收数据不一致,
fuxiangli0627 发表于 2012-4-28 21:43:47 | 显示全部楼层
TQ_guoxixiao 发表于 2012-4-27 11:39
大小写全部转换成大写
请详细解释一下。

版主大侠您好,我在用J-Link烧写天嵌的U-boot镜像文件时出现错误,我的板子是TQ2440,我安装的是天嵌光盘里带的那个J-Link驱动。。。我是按照天嵌的使用手册一步一步设置J-Link的,但是就出现下面的错误。。。百思不得其解啊!!求版主帮忙!!在下万分感谢!!
[img]file:///D:/Program%20Files/Tencent/QQ/Users/416724061/Image/OR62DG%7B%60[%60_7[]%7B8LPN0QK1.jpg[/img]



OR62DG{`[`_7[]{8LPN0QK1.jpg (125.92 KB, 下载次数: 0)
4 分钟前 上传
下载次数: 0






 楼主| 小汪 发表于 2012-4-29 18:14:27 | 显示全部楼层
天嵌例程串口设置有问题,自己解决了
cepoly 发表于 2012-4-29 18:39:00 | 显示全部楼层
小汪 发表于 2012-4-29 18:14
天嵌例程串口设置有问题,自己解决了

什么问题??我用了这么久都没发现。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号-2 )

GMT+8, 2024-9-24 09:30 , Processed in 1.029337 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

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