问题描述
- 在工控机下正常执行的串口液晶测试程序,到arm平台下不能正常执行
-
串口液晶屏在工控机上测试程序可行,到开发板上不行?
串口液晶使用的是SLCM19264
工控机系统为unbuntu10.04,编译器gcc
开发板为arm的xm31平台,交叉编译器arm-none-linux-gnueabi-gcc
程序如下
#include
#include
#include
#include
#include
#include
#include
#include
#includeint 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版
编写两个测试程序(由液晶测试程序稍作修改)
两者间的收发无问题
各位大神有谁知道还能从什么方面考虑?