USB-serial 串口测试

驱动支持usb-serial

我用的usb-serial接口线是pl2303, 所以linux kernel加入pl2303支持后(或者以模块方式加载),插入usb-serial,系统自动在增加了/dev/ttyUSB0这个设备

 

验证程序

接下来就是程序验证一下串口功能,在网上找了一个发送和接收程序,写的相当罗嗦,但是能工作

 

1.      receive.c程序清单:

#include <stdio.h>

#include <string.h>

#include <malloc.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <unistd.h>

#include <termios.h>

#include "math.h"

#define max_buffer_size   100   /*定义缓冲区最大宽度*/

/*********************************************************/

int fds;

int open_serial(int k)

{

  if(k==0)       /*串口选择*/

   {

     fd = open("/dev/ttyS0",O_RDWR|O_NOCTTY);  /*读写方式打开串口*/

     perror("open /dev/ttyS0");

   }

  else

   {

     fd = open("/dev/ttyS1",O_RDWR|O_NOCTTY);

     perror("open /dev/ttyS1");

   }

  if(fd == -1)  /*打开失败*/

   return -1;

  else

   return 0;

}

/********************************************************************/

int main()

{

char  hd[max_buffer_size],*rbuf; /*定义接收缓冲区*/

int flag_close, retv,i,ncount="0";

struct termios opt;

int realdata="0";

/*******************************************************************/

open_serial(0);    /*打开串口1*/

/*******************************************************************/

tcgetattr(fd,&opt);

cfmakeraw(&opt);

/*****************************************************************/

cfsetispeed(&opt,B9600); /*波特率设置为9600bps*/

cfsetospeed(&opt,B9600);

/*******************************************************************/

tcsetattr(fd,TCSANOW,&opt);

rbuf="hd"; /*数据保存*/

printf("ready for receiving data.../n");

retv="read"(fd,rbuf,1);   /*接收数据*/

if(retv==-1)

{

 perror("read"); /*读状态标志判断*/

}

/*************************开始接收数据******************************/

while(*rbuf!='/n')       /*判断数据是否接收完毕*/

 {

      ncount+=1;

      rbuf++;

      retv="read"(fd,rbuf,1);

      if(retv==-1)

      {

perror("read");

    }

 }

/*******************************************************************/

printf("The data received is:/n");  /*输出接收到的数据*/

for(i="0";i<ncount;i++)

{

     printf("%c",hd[i]);

}

printf("/n");

flag_close =close(fd);

if(flag_close ==-1)   /*判断是否成功关闭文件*/

printf(“Close the Device failur/n”);

return 0;

}

/****************************结束***********************************/

2.send.c程序清单

/*******************************************************

* File Name     send.c

* Description  send data to serial_Port

* Date         

*******************************************************/

/******************头文件定义******************/

#include <stdio.h>

#include <string.h>

#include <malloc.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <unistd.h>

#include <termios.h>

#define max_buffer_size   100   /*定义缓冲区最大宽度*/

/*******************************************/

int fd;  /*定义设备文件描述符*/

int flag_close

int open_serial(int k)

{

  if(k==0)       /*串口选择*/

   {

     fd = open("/dev/ttyS0",O_RDWR|O_NOCTTY);  /*读写方式打开串口*/

     perror("open /dev/ttyS0");

   }

  else

   {

     fd = open("/dev/ttyS1",O_RDWR|O_NOCTTY);

     perror("open /dev/ttyS1");

   }

  if(fd == -1)  /*打开失败*/

   return -1;

  else

   return 0;

}

/********************************************************************/

 

int main(int argc, char *argv[ ] )

{

 char sbuf[]={"Hello,this is a Serial_Port test!/n"};/*待发送的内容,以/n为结束标志*/

 int sfd,retv,i;

 struct termios option;

 int length="sizeof"(sbuf);/*发送缓冲区数据宽度*/

/*******************************************************************/

open_serial(0);    /*打开串口1*/

/*******************************************************************/

printf("ready for sending data.../n"); /*准备开始发送数据*/

tcgetattr(fd,&option);

cfmakeraw(&option);

/*****************************************************************/

cfsetispeed(&opt,B9600); /*波特率设置为9600bps*/

cfsetospeed(&opt,B9600);

/*******************************************************************/

tcsetattr(fd,TCSANOW,&option);

retv="write"(fd,sbuf,length);  /*接收数据*/

if(retv==-1)

{

 perror("write");

}

printf("the number of char sent is %d/n",retv);

 

flag_close =close(fd);

if(flag_close ==-1)   /*判断是否成功关闭文件*/

printf(“Close the Device failur/n”);

 

return 0;

}

/****************************结束***********************************/

 

 

编译send receive上传到板子上, 开一个adb shell执行./receive, 开另外一个adb shell执行 ./send,可以看到receive端接收到了数据

 

 

串口连接

之前我用usb-serial一端连接设备,另外一端连接到自己的PC上,在板子和PC上分别跑receive和send程序,receive阻塞,无法收到数据。搞了两天,最后发现是不能直连,必须找个转接头(2接3, 3 接2)。我们平时用的连接设备到开发板的也是直连线,这种线直连两台PC是不能通信的。

 

因为手头没有转接头,放弃了在设备和PC通信的想法,用线连接2和3脚,在设备上测试串口功能。

 

 

驱动Module方式支持

因为Usb-serial有多种芯片,对应不同的芯片驱动,在Ubuntu的机器上,可以把这些驱动编译为模块方式,在插入usb-serial转换器时,USB子系统会先检测设备的基本信息,再根据这些信息自动加载相应的驱动。

但是在我的板子上,不知为何插入usb-serial转换器不能执行自动加载驱动,这涉及到hotplug, udev和USB子系统,有时间我会再研究一下。

暂时的解决办法就是把pl2303直接编译到内核中。

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: windows系统中遇到prolific usb-to-serial 1500000乱码的问题,可能是由于以下原因导致的: 首先,确保你所使用的prolific usb-to-serial驱动程序已经正确安装。如果驱动程序没有正确安装,会导致乱码问题出现。可以尝试重新安装驱动程序并重启计算机,然后再次连接设备。 其次,检查设备的串口通信参数设置是否正确。包括波特率、数据位、停止位和校验位等参数。如果这些参数设置不正确,也会导致数据传输乱码。可以通过设备管理器中的串行端口属性或者串口通信软件来修改这些参数。 另外,可能是因为设备本身的硬件问题导致乱码。可以尝试将设备连接到其他计算机进行测试,如果在其他计算机上也出现乱码问题,则很可能是设备本身的问题,可以尝试更换设备或联系厂家进行维修。 最后,检查所使用的软件或程序是否与设备兼容。有些软件可能对特定的设备兼容性较差,导致数据乱码。可以尝试使用其他串口通信软件来进行测试,看是否还会出现乱码问题。 总之,解决prolific usb-to-serial 1500000乱码问题需要确定驱动程序是否正确安装、检查串口通信参数设置、排除设备硬件问题以及兼容性问题。希望以上的方法能够帮助解决你遇到的问题。 ### 回答2: Windows中的问题有可能是由于Prolific USB-to-Serial驱动程序的不兼容性引起的。在连接1500000的波特率的USB to Serial设备时,可能会出现乱码问题。 为了解决这个问题,可以尝试以下步骤: 首先,确保你使用的是最新版本的Prolific USB-to-Serial驱动程序。你可以从Prolific官方网站下载并安装最新的驱动程序。如果你已经安装了旧版本的驱动程序,建议先卸载旧版本,然后安装最新版本。 其次,确保你的USB to Serial设备支持1500000的波特率。如果设备本身不支持这个速率,那么无论如何设置,都会出现乱码问题。查看设备的规格和说明书,确保设备支持所需的波特率。 此外,还可以尝试更改波特率设置。首先连接USB to Serial设备到电脑上,然后打开设备管理器。在设备管理器中找到你的USB to Serial设备,右键点击并选择“属性”。在“属性”窗口的“高级”选项卡中,会看到波特率设置。将波特率设置为1500000,保存更改,并重新启动计算机。 最后,如果以上步骤都没有解决问题,可以尝试使用其他USB to Serial设备。有时候设备自身的问题也可能导致乱码。如果使用其他设备没有问题,那么可能是你的设备出现了故障。 总之,解决Windows中Prolific USB-to-Serial 1500000乱码问题的关键是确保你使用的是最新版本的驱动程序,设备支持所需的波特率,并按照正确的步骤进行设置。如果问题仍然存在,可以尝试其他设备或者联系厂家获取支持。 ### 回答3: windows系统的Prolific USB-to-Serial驱动器在使用时出现乱码的问题可能是由于以下几个原因造成的: 1.驱动版本问题:旧版本的驱动程序可能无法与较高的波特率(例如1500000)兼容,因此需要更新到最新版本的驱动程序。您可以在Prolific官方网站上下载最新的驱动程序,并按照说明进行安装。 2.驱动设置问题:在设备管理器中,右键单击Prolific USB-to-Serial设备,并选择“属性”选项。在属性对话框中,点击“高级”选项,并确保“波特率”设置与您使用的波特率(1500000)一致。如果设置不正确,可以尝试更改设置并重新连接设备。 3.硬件问题:如果以上方法都无效,那么可能是USB串口适配器硬件本身存在问题。您可以尝试使用其他USB端口进行连接,或者更换另一台计算机进行测试,以确定是否是硬件故障引起的乱码问题。 综上所述,如果遇到Prolific USB-to-Serial驱动器在1500000波特率下出现乱码的情况,首先应该更新驱动程序版本,然后检查驱动设置是否正确,并且排除硬件故障的可能性。如若问题仍然存在,建议联系Prolific官方技术支持寻求进一步的帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值