天嵌 ARM开发社区

 找回密码
 注册
查看: 2990|回复: 8

开发板与PC串口通信所遇到的问题

[复制链接]
kongxiaobo 发表于 2012-2-9 08:40:47 | 显示全部楼层 |阅读模式
用程序实现PC与tq2440的串口通信问题,PC实现写,开发板实现读。但是遇到两个问题:
第一:PC端写入的内容不能即使在stdin中显示出来,但是平常的测试是可以的,而这个程序却需要等个几秒种才显示,但是数据都是正确的。不知道为什么?
第二:开发板接收过来的数据都是乱码,而且接受的数据个数不对,我在PC端写入很多内容,但是无法全部从开发板接收过来,只有那么一行,且都是乱码,波特率设置应该是正确的,因为在超级终端等串口通信设备进行串口通信的时候是115200,且接收和发送都正常。但是在程序里设置这个波特率,却出现了乱码,不知道是什么原因?请大家帮我分析一下,谢谢。


TQ_guoxixiao 发表于 2012-2-9 09:18:48 | 显示全部楼层
像上面这些复杂的问题,原因不容易看出来的,建议加技术支持qq。
 楼主| kongxiaobo 发表于 2012-2-9 09:57:20 | 显示全部楼层
TQ_guoxixiao 发表于 2012-2-9 09:18
像上面这些复杂的问题,原因不容易看出来的,建议加技术支持qq。

请问贵公司技术部qq是多少?
亚瑟王 发表于 2012-2-20 11:47:01 | 显示全部楼层
亲,在光盘里面的apps.tar.bz2压缩包里面有串口测试程序的源码的,可以读和写串口,你可以参考一下。
亚瑟王 发表于 2012-2-20 11:47:37 | 显示全部楼层
这个售后QQ号码可以加的,不过建议在论坛处理,后来的人都可以参考学习:1912823076
TQ_guoxixiao 发表于 2012-2-20 12:05:54 | 显示全部楼层
这个程序却需要等个几秒种,肯定是你程序接受的问题,接受慢。
可以贴出来代码,帮你看看。
 楼主| kongxiaobo 发表于 2012-2-21 17:33:39 | 显示全部楼层
亚瑟王 发表于 2012-2-20 11:47
这个售后QQ号码可以加的,不过建议在论坛处理,后来的人都可以参考学习:1912823076

好的,麻烦您了
 楼主| kongxiaobo 发表于 2012-2-21 17:37:28 | 显示全部楼层
TQ_guoxixiao 发表于 2012-2-20 12:05
这个程序却需要等个几秒种,肯定是你程序接受的问题,接受慢。
可以贴出来代码,帮你看看。

arm端:
/*
*实现开发板与宿主机的串口通信
*宿主机实现写,开发板读
*步骤:
        1.打开串口
        2.设置串口参数
        3.读写串口(包括宿主机和开发板)
*/

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

#include "open_port_arm9.c"
#include "../set_opt.c"
#include "pthread.h"

#define BUFFER_SIZE 30                /*最大缓冲区*/
#define TARGET_COM_PROT 1        /*用n表示目标机上的串口n*/

int main(int argc,char* argv[]){
        //打开串口设备
        int fd;
        char buff[BUFFER_SIZE];
       
        if(fd = open_port(TARGET_COM_PROT) < 0){
                perror("open_port");
                return -1;
        }

        if(set_opt(fd,115200,8,'N',1) < 0){
                perror("set_port_config");
                return -1;       
        }
/*       
        do{
                memset(buff,0,BUFFER_SIZE);
                sleep(1);
                int ret = 0;
                if((ret = read(fd,buff,BUFFER_SIZE)) > 0){
                        printf("The recevied words are %d,and str = %s\n",ret,buff);
                }
       
       
        }while(strncmp(buff,"quit",4));               
*/
        printf("welcome to tq2440\n");
        while(1){       
                int ret = 0;
                if((ret = read(fd,buff,BUFFER_SIZE)) > 0){
                        buff[ret] = '\0';
                        printf("\nrecv:%d\n",ret);
                        printf("%s",buff);
                        printf("\n");
                }else{
                        printf("no data\n");
                }       
        }
        close(fd);
        return 0;
}















pc端:
/*
*实现开发板与宿主机的串口通信
*宿主机实现写,开发板读
*步骤:
        1.打开串口
        2.设置串口参数
        3.读写串口(包括宿主机和开发板)
*/

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

#include "open_port.c"
#include "../set_opt.c"

#define HOST_COM_PORT 1        /*表示PC的串口1*/
#define BUFFER_SIZE 30        /*最大缓存大小*/

/*
* 写数据到开发板
*/

int main(int argc,char* argv[]){
        int fd;
        char buff[BUFFER_SIZE];
        if(fd = open_port(HOST_COM_PORT) < 0){
                perror("open_port");
                return -1;
        }

        if(set_opt(fd,115200,8,'N',1) < 0){
                perror("set_port_config");
                return -1;
        }
       
        do{
                /*
                printf("Input some words(enter 'quit' to exit):");
                memset(buff,0,BUFFER_SIZE);
                if(fgets(buff,BUFFER_SIZE,stdin) == NULL){
                        perror("fgets");
                        break;
                }
                */
                       
                int ret;       
                if((ret = read(fd,buff,BUFFER_SIZE)) > 0){
                        buff[ret] = '\0';
                        printf("\n%d\n",ret);
                        printf("%s",buff);
                        printf("\n");
                }
       
                //write(fd,buff,strlen(buff));
        }while(strncmp(buff,"quit",4));               
        close(fd);
        return 0;
}

参数设置函数:
/*
*设置串口参数
*
*/
int set_port_config(int fd,int baud_rate,int data_bits,char parity,int stop_bits){
        struct termios new_cfg,old_cfg;
        int speed;
       
        //1.保存原先串口配置               
        if(tcgetattr(fd,&old_cfg) != 0){
                perror("tcgetayttr");
                return -1;
        }       
        new_cfg = old_cfg;
       
        //2.激活选项       
        cfmakeraw(&new_cfg);

        //3.设置字符大小
        new_cfg.c_cflag &= ~CSIZE;

        //4.设置波特率
        switch(baud_rate){
        case 2400:
                speed = B2400;
                break;
        case 4800:
                speed = B4800;
                break;
        case 9600:
                speed = B9600;
                break;
        case 19200:
                speed = B19200;
                break;
        case 38400:
                speed = B38400;
                break;
        default:
        case 115200:
                speed = B115200;
                break;
        }
        tcflush(fd,TCIOFLUSH);
        cfsetispeed(&new_cfg,speed);
        cfsetospeed(&new_cfg,speed);                       
        tcflush(fd,TCIOFLUSH);       

        //5.设置数据位
        new_cfg.c_cflag |= (CLOCAL | CREAD);
        new_cfg.c_cflag &= ~CSIZE;
        switch(data_bits){
                case 7:
                        new_cfg.c_cflag |= CS7;
                        break;
                default:
                case 8:       
                        new_cfg.c_cflag |= CS8;
                        break;
        }

        //6.设置奇偶校验位
        switch(parity){
                default:
                case 'n':
                case 'N':
                        new_cfg.c_cflag &= ~PARENB;
                        new_cfg.c_cflag &= ~INPCK;
                        break;
               
                case 'o':
                case 'O':
                        new_cfg.c_cflag |= (PARODD | PARENB);
                        new_cfg.c_cflag |= INPCK;
                        break;
               
                case 'e':
                case 'E':
                        new_cfg.c_cflag |= PARENB;
                        new_cfg.c_cflag &= ~PARODD;
                        new_cfg.c_cflag |= INPCK;
                        break;
               
                case 's':
                case 'S':
                        new_cfg.c_cflag &= ~PARENB;
                        new_cfg.c_cflag &= ~CSTOPB;
                        break;

        }
       
        //7.设置停止位
        switch(stop_bits){
                default:
                case 1:
                        new_cfg.c_cflag &= ~CSTOPB;
                        break;
                case 2:
                        new_cfg.c_cflag |= CSTOPB;
                        break;
        }
       
        if(parity != 'n'){
                new_cfg.c_iflag |= INPCK;
        }


        //8.设置最少字符和等待时间
        new_cfg.c_cc[VTIME] = 0;
        new_cfg.c_cc[VMIN] = 0;

        new_cfg.c_iflag |= IGNPAR|ICRNL;
        new_cfg.c_oflag |= OPOST;
        new_cfg.c_iflag &= ~(IXON|IXOFF|IXANY);

        //9.处理未接受的字符
        tcflush(fd,TCIFLUSH);

        //10.激活新配置
        if((tcsetattr(fd,TCSANOW,&new_cfg)) != 0){
                perror("tcsetattr");
                return -1;
        }
        tcflush(fd,TCIOFLUSH);
        return 0;                       
}
还有一个打开串口函数就不贴了






TQ_guoxixiao 发表于 2012-2-23 09:47:35 | 显示全部楼层
1、按照您开始提出的问题,只有等待几秒钟之后才显示。看你终端代码,很可能是几个sleep(1)造成的。如果后来屏掉了,从程序看不出来是哪里导致的延时,建议多加些打印信息,排查到具体哪里造成的延时。
2、pc写入很多数据,但接受的只有一行,可能是你读数据的长度的原因,看你代码,是30.建议写大点试试。
3、您最初提供的问题,第一条说数据都正确,第二条说数据出现乱码。您先确定程序稳定在第一条说的情况,也就是数据都正确。乱码的问题,第一条说的情况,您已经解决过了呀。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

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

GMT+8, 2024-10-7 04:29 , Processed in 1.040949 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

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