我按照下面的程序,写串口成功,不过如果把写出的内容直接写成"1234"之类的,不指定为16进制,则在接收得串口调试助手上显示的时候会显示31 32 33 34,也就是每个加上30,这个好像是和系统内部的编码有关系,需要再查查相关资料。
--------------------------------------------------------
struct termios Opt;
int m_fd = open("/dev/ttyAM1", O_RDWR | O_NOCTTY | O_NDELAY);
if(m_fd==-1)
printf("cannot open ttyAM1\n");
tcgetattr(m_fd, &Opt);
cfsetispeed(&Opt,B9600);
cfsetospeed(&Opt,B9600);
tcsetattr(m_fd,TCSANOW,&Opt);
write(m_fd, "\x0a", 1);
close(m_fd);
以上代码即为往串口写"\x0a",可是输出却是回车换行,有什么办法能让输出的就是一个16进制数???
---------------
不是你的问题,你输出0x0a, dos自动给你转换成0x0d0x0a.你是没有办法的。
你可以用相应工具转换输出文本格式。ftp的时候用ascii方式。
想不出还会有什么问题的。
http://topic.csdn.net/t/20060727/12/4908630.html#
===========================================================
zhangwy
急!!!!linux下串口的问题
int m_fd = open("/dev/ttyAM1", O_RDWR | O_NOCTTY | O_NDELAY);
struct termios Opt;
tcgetattr(m_fd, &Opt);
cfsetispeed(&Opt,B9600);
cfsetospeed(&Opt,B9600);
tcsetattr(m_fd,TCSANOW,&Opt);
write(m_fd, "\x0a", 1);
close(m_fd);
以上是小弟的程序,运行后串口上收到的不是0a, 而是0d 0a,请问为什么会这样?怎么解决
2006-7-26 21:20 carboy
急!!!!linux下串口的问题
\n在WIN32下是 0d 0a
而在linux 下是0a
不知你的串口接受端是什么操作系统?
2006-7-26 21:50 carboy
急!!!!linux下串口的问题
WINDOWS的文本文件 使用 \r\n 作为换行 即 0xd 0xa
UNIX 的文本文件 使用 \n 作为换行 即 0xd
如果使用二进制保存,则windows和linux一样,都是0x0a。
在内存中 \n也是 0x0a,但是win下保存成文本文件,会加上0x0d
2006-7-27 08:44 zhangwy
急!!!!linux下串口的问题
我的接收端是一个单片机控制的串口液晶屏,我用装有ucLinux操作系统的嵌入式开发办向这个液晶屏发送十六进制的命令,当发送含有0x0a的命令是屏幕就无法正常显示。
当我用装有Windows的PC机来接收嵌入式板发来的命令时,所有的0x0a就都变成了0x0d 0x0a。
斑竹说的有道理,但是具体怎么用二进制来保存啊?能否给小弟写几行代码,万分感谢。
2006-7-27 22:01 carboy
急!!!!linux下串口的问题
随便写了几行代码,生成的文件用ultraedit打开时询问是否从UNIX转成DOS格式,选否,则回车只有0x0a,选是,则会添加0x0d
代码供参考:
#include "stdio.h"
int main(void)
{
FILE *fp = fopen("c:\\testfile", "wb");
fwrite(("how are \n you"), sizeof( char ), 16, fp );
fclose(fp);
}
2006-7-28 09:08 zhangwy
急!!!!linux下串口的问题
感谢斑竹指点,可是我想向串口发送0x0a该怎么办啊?问题依旧没有解决。
2006-7-28 21:54 carboy
急!!!!linux下串口的问题
[这个贴子最后由carboy在 2006/07/28 10:08pm 第 1 次编辑]
从串口发出来的就是0x0a回车符号,win接收到的也是0x0a,不过win在存成文件的时候,自己加上0x0d的,所以我个人认为并没有错误,只是回车换行在unix下为0xa,但是win下是0x0d 0x0a,都是表示回车换行。
至于你的嵌入式板子,要在程序里处理好0x0a,填好显示buffer,具体的,我有空再去看看,手机里这样的用法很多。
2006-7-31 10:32 zhangwy
急!!!!linux下串口的问题
问题解决了,我们公司的高手找到的办法
struct termios Opt;
int m_fd = open("/dev/ttyAM1", O_RDWR | O_NOCTTY | O_NDELAY);
if(m_fd==-1) perror("lcd_drawlib: Cannot open ttyAM1!\n");
//设置 串口的NL-CR 和CR-NL 的映射
tcgetattr(m_fd,&Opt); //首先读取系统默认设置options
Opt.c_oflag &=~(INLCR|IGNCR|ICRNL);
Opt.c_oflag &=~(ONLCR|OCRNL);
tcflush(m_fd,TCIFLUSH); /* Update the options and do it NOW */ //刷新和立刻写进去
//设置波特率
cfsetispeed(&Opt,B9600);
cfsetospeed(&Opt,B9600);
tcsetattr(m_fd,TCSANOW,&Opt);
write(m_fd, "\x0a", 1);
close(m_fd);
2006-7-31 10:40 zhangwy
急!!!!linux下串口的问题
问题是解决了,但是我觉得串口设置的结构体好复杂,并没有彻底理解。要是有关于串口设置的详细资料还请共享一下,先谢了。
==============================================================
文章评论(0条评论)
登录后参与讨论