about serial port programming many many thanks to xtang etc

唐先生等各位专家:
不好意思又要麻烦大家了,请教你们几个串口编程的问题。
1. 请问在qnx里,串口的缓存区的运行机制是什么呢?(可能听着像门外话),具体到我的操作上,比如我想用时钟,每1秒(甚至更长,3-4秒)激发一个子线程读取数据,在程序的开头,指定好buffer为256字节,(或更少,如40字节),接收的baud为38400bps: 如果按这么设置的话,buffer应该很快就读满了,那么当读满之后qnx会怎样处理呢,是不再接收数据了呢,还是继续接收并同时清除早先已存的数据呢,如果是按第二种的话,那么如果以1s/256个字节 的读取速率就不能读到所有的数据了,是吗?
2. 我参考了大家的帖子,也看了一下和我项目有关的论文,对于我follow的idea,其中有几点不懂:
程序框架如下:
Void *periodic_thread(void *arg)
{
int com1, rcv_byte;
byte data[numberofbyte];
system(“device-ser8250, -u1 03f8, 4 &”);
com1= open(“/dev/ser1”, O_RDWR);
initialize_serial(com1, 115kbps, 8bits, istopbit, even_parity);

while
{
Wait_for_condar();
AskData(SENSOR, com1);
rcv_byte = read(com1, data, sizeof(data));
if(rcv_byte = = numberofbyte)
DumpTosharedMemory(data);
Else
SetError(SENSOR);
}
}

一是 byte是什么,从没见过这种数据类型呀
二是 AskData做了什么工作呢,看起来好像是将Sensor的数据读到com1里,先说明一下,这个sensor可以115kbps,每秒50个或更多个包(每个包37个字节,首两个字节为UU,尾两个字节为checksum)的方式传送数据,但是我不明白这一步是作甚么的,因为我觉得open,initial,read,close这几步已经足可以做读数据的工作了,加这一步是为什么呢,希望有类似经验的专家赐教。派生出来的问题是raw 和edit mode的区别,是不是接收数据包用edit mode更理想呢?
三是: initialize 那条命令具体含义是什么呢,一般这种命令不是应该放在system image里面吗?
这样做是不是以中断的方式来接收数据(之所以这样问,是因为不明白irq number: 4的作用)

3. 我试验的程序中,这样display:
Printf(“data is: %X, %X,….”, buffer[1], buffer[2],….), 但是为什么会显示出FFFFFFFD,这种这么多位的数呢,一个字节顶多就显示成FF呀?

问题很愚,希望xtang先生等高人指点迷津!!!鄙人感激不尽!!!!

  1. “串口的缓存”是由devc-ser8250的-I和-O设定的,不知道你说“在程序的开头,指定好buffer为256字节,(或更少,如40字节)”是什么意思。

-I和-O分别控制读、写缓存。如果你设-I 256(输入缓存256字节),那么,devc-ser8250每从端口收到一个字节,就放入这个缓存,放满256个字节后,再不能放了,就会把收到的字节扔掉。

用户程序每次read(),读走多少,缓存就空出多少。如果全部读走,则缓存又回到256字节(devc-ser8250可以再放256字节进去),这样周而复始。如果缓存中没有字节,用户程序去read()的话,通常用户程序会被阻塞;除非用户程序是O_NONBLOCK来open()的,那时read()会返回一个-1(出错),出错代码通常是 EAGAIN。

  1. byte顾名思义是unsigned char,具体在哪里定义的,你要到自已的头文件中去找。
    具体AskData()做什么,不看程序不知道。纯凭测试,可能是要向com1里写几个字节,通知Sensor可以送数据了。然后才能去读Sensor的数据。通常raw模式比较合适。
    initialize_serial()就是初始化端口,之所以在程序里初始化,而不是依赖命令行,是因为可能会有别的程序把端口改成别的设置。如果你问的是system()那一行,那是用来启动一个程序的(去查system()函数),这个启动devc-ser8250的过程的确有点奇怪,一般都是事先启动好,而不是由某一个程序去启动。
  1. printf()的问题,估计是byte被定义成signed的,或者不是char。你可以强行指定:

printf("%X, %X", (unsigned char)buffer[1], (unsigned char)buffer[2]);