原创 linux下写串口的程序★★★★

2011-6-14 21:13 3055 7 7 分类: MCU/ 嵌入式
我按照下面的程序,写串口成功,不过如果把写出的内容直接写成"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条评论)

登录后参与讨论
我要评论
0
7
关闭 站长推荐上一条 /2 下一条