移植-在工控机下正常执行的串口液晶测试程序,到arm平台下不能正常执行

问题描述

在工控机下正常执行的串口液晶测试程序,到arm平台下不能正常执行

串口液晶屏在工控机上测试程序可行,到开发板上不行?
串口液晶使用的是SLCM19264
工控机系统为unbuntu10.04,编译器gcc
开发板为arm的xm31平台,交叉编译器arm-none-linux-gnueabi-gcc
程序如下
#include
#include
#include
#include
#include
#include
#include
#include
#include

int fd;

static void uart_set(int fd, int baud, int databits, char parity, int stopbits)
{
struct termios opt;

tcgetattr (fd, &opt);
opt.c_cflag |= (CLOCAL | CREAD);
printf("ispeed = %dn", cfgetispeed(&opt));
printf("ospeed = %dn", cfgetospeed(&opt));
switch (baud)
{
    case 9600:
        cfsetispeed(&opt, B9600);
        cfsetospeed(&opt, B9600);
        break;

    case 19200:
        cfsetispeed(&opt, B19200);
        cfsetospeed(&opt, B19200);
        break;

    case 57600:
        cfsetispeed(&opt, B57600);
        cfsetospeed(&opt, B57600);
        break;

    case 115200:
        cfsetispeed(&opt, B115200);
        cfsetospeed(&opt, B115200);
        break;

    default:
        cfsetispeed(&opt, B115200);
        cfsetospeed(&opt, B115200);
        break;
}

opt.c_cflag &= ~CSIZE;
switch (databits)
{
    case 7:
        opt.c_cflag |= CS7;
        break;

    case 8:
        opt.c_cflag |= CS8;
        break;

    default:
        printf ("Unsupported data sizen");
        return;
}

switch (parity)
{
    case 'n':
    case 'N':
        opt.c_cflag &= ~PARENB;

        break;

    case 'o':  // odd
    case 'O':
        opt.c_cflag |= (PARODD | PARENB);
        //opt.c_iflag |= INPCK;
        break;

    case 'e': // even
    case 'E':
        opt.c_cflag |= PARENB;
        opt.c_cflag &= ~PARODD;
        //opt.c_iflag |= INPCK;
        break;

    case 's':  //space
    case 'S':
        opt.c_cflag &= ~PARENB;
        opt.c_cflag &= ~CSTOPB;
        break;

    default:
        printf ("Unsupported parityn");
        return;
}

switch (stopbits)
{
    case 1:
        opt.c_cflag &= ~CSTOPB;
        break;

    case 2:
        opt.c_cflag |= CSTOPB;
        break;

    default:
        printf ("Unsupported stop bitsn");
        return;
}

opt.c_cc[VTIME] = 0;
opt.c_cc[VMIN] = 0; 

// set raw input
opt.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
opt.c_iflag &= ~(INLCR | ICRNL | IGNCR);

// set raw output
opt.c_oflag &= ~OPOST;
opt.c_oflag &= ~OLCUC;
opt.c_oflag &= ~ONLRET;
opt.c_oflag &= ~ONOCR;
opt.c_oflag &= ~OCRNL;

tcsetattr (fd, TCSANOW, &opt);
printf("ispeed = %dn", cfgetispeed(&opt));
printf("ospeed = %dn", cfgetospeed(&opt));
tcflush(fd, TCOFLUSH);
tcflush(fd, TCIFLUSH);

}

void Display_info()
{
printf("%sn", FUNCTION);
int ret;
char *s = "?";

char c = 0x3F;
char c2  = 0x0D;    

char c3 = 0x72;
char c4 = 0x65;
char c5 = 0x73;

ret = write(fd, &c, 1);
ret = write(fd, &c, 1);
ret = write(fd, &c, 1);
ret = write(fd, &c2, 1);
printf("write okn");
//ret = write(fd, "???", 3);
//ret = write(fd, "r", 1);
usleep(DISPLAY_DELAY);

}

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

int nread,i;
int nwrite;
unsigned char buff[1024] = {0};

if (argc == 1) {
if((fd=open_port(1, "/dev/ttyS0"))<0) {
perror("open_port error");
return -1;
}

} else {
if((fd=open_port(1, argv[1]))<0) {
perror("open_port error");
return -1;
}
}

printf("fd = %dn", fd);
uart_set(fd, 19200, 8, 'n', 1);

    while(1) {
        //Display_Menu();
        Display_info();
        usleep(2000000);
        printf("ready readn");
        nread = read(fd,buff,1024);

        printf("read okn");
        printf("nread=%d,%sn",nread,buff);
    }

close(fd);
return 0;

}

状况是运行程序后,write没有写进去,read返回nread = 0(类似没有在串口接入任何东西的状态)

已经做过的测试:
1.应用程序
用已有的程序实验,在工控机上无问题(液晶屏,应用程序无错)

2.驱动
短接2,3,发现输出,输入无问题(接口,驱动无错)

怀疑:连线问题

结果:线序错了

3.还是无反应
链接液晶屏端串口rt端口
自测有效,排除线的问题。

请问哪位大神知道还有可能是什么问题导致的现在这种情况???

解决方案

7,工控机自发自收,
arm版自发自收都ok

8.更换开发板为rs232的,开发板与工控机收发数据正常

开发板与液晶屏依旧无反应(/dev/ttymxc2)
开发板rs电压:-3.0~3.0 :失败和电压值无关

9.万万没想到,最终是屏的问题,换了块就好了。
差异:原来的屏程序输入后反应延迟几秒钟,且会返回个0x00h,不知原因

10.(最不可能的地方,也许就是那个结果)

解决方案二:

检查下是不是大端和小端不同造成的?

解决方案三:

4.怀疑大小端问题
经测试两个系统都是小端的

5.怀疑是ttl和rs232
短接各个rt,测电压
液晶屏:-2.8 2.8
工控机:-6.0 6.0
arm版: -9.0 9.0
都是rs232

6.工控机通arm版
编写两个测试程序(由液晶测试程序稍作修改)
两者间的收发无问题

各位大神有谁知道还能从什么方面考虑?

时间: 2024-07-31 11:58:37

移植-在工控机下正常执行的串口液晶测试程序,到arm平台下不能正常执行的相关文章

Linux Kernel之flush_cache_all在ARM平台下是如何实现的【转】

转自:http://blog.csdn.net/u011461299/article/details/10199989 版权声明:本文为博主原创文章,未经博主允许不得转载. 在驱动程序的设计中,我们可能会用到flush_cache_all将ARM cache的内容刷新到RAM,这是因为ARM Linux中cache一般会被设定为write back的.而通常象DMA是访问不了cache,所以如果我们需要启动DMA将RAM中的内容写到Flash中或LCD framebuffer,那么我们就需要调用

XML在.net平台下的自定义控件的应用(2)

xml|控件 第二步,就是加入XML特性注意,任何xml文档在其被处理之前最好先进行有效性验证,提供验证一般有两种重要的途径.其一就是提供DTD(文档类型定义),实际上就是让用户提供指令集,然后在xml文档加载的时候对其进行有效性分析,看是否有无效指令,简单说就是创建一个编译环境:另外一个就是提供一个所谓的schema..其作用跟DTD完全一样,只是在表现形式上好于DTD,因为它本身也是一个XML文档.这里我采用了schema的形式,当然了,读者用兴趣也可以将其替换问相应的DTD版本.下面

XML在.net平台下的自定义控件的应用(3)

为了更加清晰的说明上面的代码,我们这里举一个例子,相信读者一目了然: <menus xmlns='x-schema:Menu.xdr'> <menu id='menuBar1'> <topmenu id="xjtu" text="xjtu" isparent="true" linkurl="xjtu"></topmenu> <submenu id="sina&qu

在fedora 10下移植QT到arm平台失败也就是运行不起来

问题描述 在fedora 10下移植QT到arm平台失败也就是运行不起来 安装了 qt-x11-opensource-src-4.5.3.tar.gz qt-embedded-linux-opensource-src-4.5.2.tar.gz 这两个. 安装方法是按照教程来装. 为了方便,我直接把qt-embedded-linux-opensource-src-4.5.2 arm 版本的装到了开发板. QTCreator 也已经设置qt-embedded- 这个安装好里的qmake build

Win32下的几种串口通信编程

要完成串口通信, 在32位模式下, 一般说来有以下四种方法: 1.以文件方式打开串口: 这里使用的是Win32 API 函数, 所以无论在BCB或VC下都可以实现.具体的函数的意义可以参考Win32 API 的帮助.这里有一个易于使用的BCB下的类, 可以方便的使用串口. 下面给出简要说明: (1) 应用CreateFile() 来初始化串口 FhFileComm=CreateFile( FCommName.c_str(), GENERIC_READ | GENERIC_WRITE, 0, //

link环境下制作一款《订餐软件》,请问远程调用怎么执行账套提交验证?

问题描述 link环境下制作一款<订餐软件>,请问远程调用怎么执行账套提交验证? link环境下制作一款<订餐软件>,请问远程调用怎么执行账套提交验证? 解决方案 远程调用可以通过web service去调用 解决方案二: 可以设置一个总库,先连接总库进行验证,然后返回所有的账套进行选择,最后再连接对应帐套的数据库

ubuntu下无法打开USB串口

问题描述 ubuntu下无法打开USB串口 有个串口的问题想请教各位一下. 问题背景:在ubuntu下跑识别apriltags程序,将处理后的信息用串口发出去. 出现问题:串口无法打开. 我已经做出的尝试: 1.最开始我用那台座机成功过一次.可以在电脑端用minicom串口调试助手,自发自收数据. 2.后来又修改了一些串口发送的通信程序,再去实验就不好用了. 3.接着去网上各种百度论坛答案,尝试着给串口安装pl2303驱动,发现并不好用. 当串口第一次插上电脑时,我用dmesg | grep t

求帮助-怎样使下面的语句独立完成判断,每个判断语句都要执行的,上面的无论满不满足都要执行下面的

问题描述 怎样使下面的语句独立完成判断,每个判断语句都要执行的,上面的无论满不满足都要执行下面的 function checkform(myform){ for(i=0;i<myform.length;i++){ if(myform.elements[i].value==""){ alert(myform.elements[i].title+"不能为空!"); myform.elements[i].focus(); return false; } } if(

在uclinux下,如何设置串口才能发at指令

问题描述 在uclinux下,如何设置串口才能发at指令 在uclinux下,如何设置串口才能发at指令? 最近上手了一个新的项目,由于代码之前已经实现在tos平台下通过串口发at指令,现在在uclinux平台下也须实现该功能,但是目前只能通过该串口看到系统启动时的调试信息,不能通过该口发送at指令. 我目前已经做的工作是:关闭该串口的控制台功能,使之成为普通串口.但是我通过关闭宏来实现该功能后,发现该串口出现的调试信息停在了start kernel这里,而且也还不能发at指令. 所以目前我有两