+ -
当前位置:首页 → 问答吧 → Linux/UNIX下串口收发问题???

Linux/UNIX下串口收发问题???

时间:2010-08-06

来源:互联网

系统环境: Solaris 10
串口设备: /dev/cua/a

程序:
#include     <stdio.h>      /*标准输入输出定义*/
#include     <stdlib.h>     /*标准函数库定义*/
#include     <unistd.h>     /*Unix标准函数定义*/
#include     <sys/types.h>  /**/
#include     <sys/stat.h>   /**/
#include     <fcntl.h>      /*文件控制定义*/
#include     <termios.h>    /*PPSIX终端控制定义*/
#include     <errno.h>      /*错误号定义*/

#define FALSE 0
#define TRUE  1
/***@brief  设置串口通信速率
*@param  fd     类型 int  打开串口的文件句柄
*@param  speed  类型 int  串口速度
*@return  void*/

int speed_arr[] = { B38400, B19200, B9600, B4800, B2400, B1200, B300,
            B38400, B19200, B9600, B4800, B2400, B1200, B300, };
int name_arr[] = {38400,  19200,  9600,  4800,  2400,  1200,  300,
            38400,  19200,  9600, 4800, 2400, 1200,  300, };
void set_speed(int fd, int speed)
{
  int   i;
  int   status;
  struct termios   Opt;
  tcgetattr(fd, &Opt);
  for ( i= 0;  i < sizeof(speed_arr) / sizeof(int);  i++)
   {
           if  (speed == name_arr)
           {
               tcflush(fd, TCIOFLUSH);
            cfsetispeed(&Opt, speed_arr);
            cfsetospeed(&Opt, speed_arr);
            status = tcsetattr(fd, TCSANOW, &Opt);
            if  (status != 0)
            perror("tcsetattr fd1");
             return;
             }
   tcflush(fd,TCIOFLUSH);
   }
}

/**
*@breif 打开串口
*/
int OpenDev(char *Dev)
{
int        fd = open( Dev, O_RDWR );         //| O_NOCTTY | O_NDELAY
        if (-1 == fd)
                { /*设置数据位数*/
                        perror("Can't Open Serial Port");
                        return -1;
                }
        else
        return fd;

}
/**
*@breif         main()
*/
int main(int argc, char **argv)
{
        int fd;
        int nread;
        char buff[512] = {0};
        char *dev ="/dev/cua/a";
        fd = OpenDev(dev);
        if (fd>0)
        {
                set_speed(fd,9600);
        }
               
        else
        {
                printf("Can't Open Serial Port!\n");
                exit(0);
                 }
        while(1)
        {
        int        cou = 0;
        int length = 28;
               while(length>0)
           {
             nread = read(fd,buff+cou,length);
                   printf("nread %d\n",nread);                     cou+=nread;
             length=length-nread;
            }
          }
       close(fd);
       return 0;
}


问题:
此程序运行在Solaris 10上。
我将这台装有Solaris 10系统的PC机和另一台装有Windows 2003系统的PC机通过一条双串口连接线相连。
当我在Windows2003系统中通过串口助手,向Solaris10机器发送一串十六进制数据,
如:7E01010000FFFFFF2600800102FF0701010000000004020100D8427E
这串数据有28个字节, 通过串口助手以十六进制形式发送。

程序显示:nread 21

为什么只收到21个节,另外7个字节怎么没有收到???

作者: iacxin099   发布时间: 2010-08-06

没人回答???

作者: iacxin099   发布时间: 2010-08-06

相关阅读 更多

热门下载

更多