串口编程求助,困扰了好几天了

xtang先生和各位高手:
不好意思又要麻烦你们关于串口编程的问题,折腾了3天,没什么进展:

我的x86(celeron650MHz)的串口com1和一个sensor连接, 我想用write写命令给它。具体一些, 我想发的数据包构成如下:
UU SF (0x)01 (0x)0001 Value Checksum
其中: UU, SF 是字符(转换成16进制是5555和5346),
value是(0x)0000, Checksum是(0x)009B
所以我要达到目的,要send 0x5555 5346 01 0001 0000 009B
我是这样做的:
(程序有点长,就写了这么多,编译时没错,必要的 <.h>初始设置都做了,baud设成38400,同于sensor的默认设置)。

#include <_pack1.h>



typedef struct{
int16_t R_header;
int16_t CMD;
int8_t Input;
int16_t Type;
int16_t Value;
int16_t R_Checksum;
} CMD_message;
.
.

main()
{ int first_time;
first_time =1;
CMD_message mymsg;
.
.
FD = open(“dev/ser1”, O_RDWR);
.
if (first_time ==1)
{
mymsg.R_header = 0x5555;
mymsg.CMD = 0x5346;
mymsg.Input = 0x01;
mymsg.Type = 0x0001;
mymsg.Value = 0x0000;
mymsg.R_Checksum = 0x009B;

iByteWrite = write(FD, &mymsg, sizeof(CMD_message));
tcflush(FD,TCIFLUSH);
first_time =0;
}
.
.read(FD, &buf, sizeof(BUF));
.
}

结果不成,我仍然能连续不断的获得数据(sensor的默认发送模式), 如果命令(实际这是一条让sensor暂停发送数据的命令)成功送出,我又清掉了输入缓存, 正确结果是我不能再读到任何字节,或读到有限几个字节。请您指导一下我哪里出错了呢?

如果不麻烦的话,还有这几个派生的问题:
1。write()函数的实质是不是将mymsg的数据写入output register(default2048的),之后再通过null modem送到sensor里,是吗?我的sensor是不断的发数据的,这样以来send命令有机会送出数据吗?
2。我这种情况可否用out8/16/32()等函数实现呢,我感觉送的是一条命令,就没考虑,但这种可能性有吗?
3。 看了您以前的答疑, 您说“串口用来送字符,不关心内容”,这是不是说qnx的串口只能用来送字符型数据呀?
4。 有篇答复您说, 可以将串口设成raw模式,给我的帖子也说过可以用 -I ,
-O命令改缓存大小,请问是不是在shell窗口里就能实现,还是必须写在image里面?


再次感谢您,liug先生和大家的多次帮助!!!!!

补充一点,为了让struct的字节不自动取整(自己编的一个词,不知道怎么讲正确 sorry),加了那个<_pack1.h> 文件,如果我这样设,那么传到sensor里的那个int8的数据会不会自动变成16位的呢,
是不是问题就在这里呀
我有的数据设成int16_t, 但显示出来是 FFFF****, 您说这是为什么呢, 应该最多就是四位的FFFF呀?
谢谢您和各位高手的指点

在往串口写数据时,特别要当心Endian。简单的说:

char buf[2]={0x53, 0x46};
write (fd, buf, 2)

不同于

int16_t buf=0x5346;
write(fd, &buf, 2);

前一种,写出去的是0x53, 0x46两个字节,后一种写出去的(在x86上)是0x46, 0x53两个字节。

所以你的这种用structure CMDmessage的方法很不可取。你可以用下面这段小程序,在write()前检验你的数据。

int i;
unsigned char *cp = (unsigned char *)&mymsg;
for (i = 0; i < sizeof(mymsg); i++)
   printf("%02x ", cp[i]);
printf("\n");
  1. write() 的结果是将&mymsg开始的sizeof(mymsg)字节,复制到串口驱动的输出缓冲(2048字节)中去。串口驱动(devc-ser8250)会用out8()等函数把这些字节送去Null Modem线,你的Sensor就可以收到这些字节。
    至于能不能在发的同时收,这个叫串行线的“全双工”或“半双工”模式,你可以去找本讲RS232的书看看。现在的232连接,通常都是全双工的。

  2. 不能。除非你写一个自已的devc-ser8250那样的驱动程序。

  3. 你可以写任意字节到串口,串口驱动通常不关心你的内容(是0,还是ff),除非串口被设制成软件流量控制了。

  4. -I和-O是devc-ser8250的命令行参数。你的image如果已经启动了串口驱动的话,你可以在shell中把它用slay杀掉重新启动。