6_13_天天向上_TTYUSB0_embedded&&zigbee_3


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <termio.h>
#include <errno.h>
#include "GPRS.h"
//#include <afx.h>


#define ZIGBEE 3  //zigbee

 /*
  *函数功能:设置串口属性
  *参数:  
        @fd:   串口文件描述符
  @nSpeed:   比特率
  @nBit:     有效位个数
  @nEvent:   有无校验位
  @nStop:    几位停止位
  返回值:设置成功与否:
        secuss:1
  error: 0
  * */
/*
unsigned long *f(char* str)
{
 unsigned long *var;
 unsigned long t;
 int len = strlen(str);
 
 if (*var > 8) //最长8位
  return 1;
 //strupr(str);//统一大写
 toupper(str);

 for (; *str; str++)
 {
  if (*str>='A' && *str <='F')
   t = *str-55;//a-f之间的ascii与对应数值相差55如'A'为65,65-55即为A
  else
   t = *str-48;
  *var<<=4;
  *var|=t;
 }
 return var;
}
*/

int set_opt(int fd,int nSpeed,int nBits,char nEvent,int nStop)
{
    struct termios newtio,oldtio;

 if(tcgetattr(fd,&oldtio) < 0)
    {
     perror("SetupSerial 1");
  return -1;
 }

 bzero(&newtio,sizeof(newtio));
 newtio.c_cflag |= CLOCAL|CREAD;
 newtio.c_cflag &= ~CSIZE;
 //设置有效数据位个数
 switch(nBits)
 {
 case 7:
  newtio.c_cflag |= CS7;
  break;
 case 8:
  newtio.c_cflag |= CS8;
  break;
 }
 switch(nEvent)
 {
    case 'O':
     newtio.c_cflag |= PARENB;
     newtio.c_cflag |= PARODD;
     newtio.c_iflag |= (INPCK|ISTRIP);
     break;
    case 'E':
     newtio.c_iflag |= (INPCK|ISTRIP);
     newtio.c_cflag |= PARENB;
     newtio.c_cflag &= ~PARODD;
     break;
    case 'N'://无奇偶校验
     newtio.c_cflag &= ~PARENB;
     break;

 }
 switch(nSpeed)
 {
 case 2400:
  cfsetispeed(&newtio,B2400);
  cfsetospeed(&newtio,B2400);
  break;
 case 4800:
  cfsetispeed(&newtio,B4800);
  cfsetospeed(&newtio,B4800);
  break;
 case 9600:
  cfsetispeed(&newtio,B9600);
  cfsetospeed(&newtio,B9600);
  break;
 case 38400:
 printf("38400\n");
  cfsetispeed(&newtio,B38400);
  cfsetospeed(&newtio,B38400);
  break;//之前漏写了这个break
 case 115200:
  cfsetispeed(&newtio,B115200);
  cfsetospeed(&newtio,B115200);
  break;
 default:
  cfsetispeed(&newtio,B115200);
  cfsetospeed(&newtio,B115200);
  break;
 }
 if(nStop == 1)
 {
     newtio.c_cflag &= ~CSTOPB;
 }
 else if(nStop == 2)
 {
     newtio.c_cflag |= CSTOPB;
 }
 newtio.c_cc[VTIME] = 0;
 newtio.c_cc[VMIN] = 0;
    tcflush(fd,TCIFLUSH);//刷新设置,使设置立即生效

 if((tcsetattr(fd,TCSANOW,&newtio)) != 0)
 {
     perror("com set error");
  return -1;
 }
 printf("set done\n");
 return 0;
}

/*
 * 函数功能:打开串口
 * 参数:
 *      @comport:打开的串口的号码
 *      @fd:     打开的文件描述符
 * 返回值:打开成功与否
 *      secuess: 返回打开的串口的文件描述符
 *      error:   -1
 * 最后修改时间:2011.12.22
 * */
int open_port(int fd,int comport)
{
 long vdisable;
 if(1 == comport)
 {
     fd = open("/dev/s3c2410_serial0",O_RDWR|O_NOCTTY|O_NDELAY);
  if(-1 == fd)
  {
     perror("can not open the port");
     return -1;
  }
 }
 if(2 == comport)
 {
     fd = open("/dev/s3c2410_serial1",O_RDWR|O_NOCTTY|O_NDELAY);
  if(-1 == fd)
  {
     perror("can not open the port");
     return -1;
  }
 }
 if(3 == comport)
 {
     fd = open("/dev/s3c2410_serial2",O_RDWR|O_NOCTTY|O_NDELAY);
  if(-1 == fd)
  {
     perror("can not open the port");
     return -1;
  }
 }
 if(8 == comport)
 {
  fd=open("/dev/ttyUSB0",O_RDWR|O_NOCTTY|O_NDELAY);
  //fd=open("/dev/ttyS0",O_RDWR|O_NOCTTY|O_NDELAY);
  //fd=open("/dev/tty",O_RDWR|O_NOCTTY|O_NDELAY);
  if(-1 == fd)
  {
     perror("can not open the port");
     return -1;
  }
 }

 if(fcntl(fd,F_SETFL,0) < 0)
  printf("fcntl error\n");
 else
  printf("fcntl=%d\n",fcntl(fd,F_SETFL,0));
 if(isatty(STDIN_FILENO) == 0)
  printf("standard input is not a terminal device\n");
 else
  printf("is a tty success \n");
 printf("fd-open=%d\n",fd);

 return (fd);
}

/*
int Ascii2Hex(const char *hex,char * ascii)             //16进制转ASCII

{
 int len = strlen(hex), tlen, i, cnt;
 
 for (i = 0, cnt = 0, tlen = 0; i<len; i++)
 {
  char c = toupper(hex[i]);

  if ((c>='0'&& c<='9') || (c>='A'&& c<='F'))
  {
   BYTE t = (c >= 'A') ? c - 'A' + 10 : c - '0';

   if (cnt)
    ascii[tlen++] += t, cnt = 0;
   else
    ascii[tlen] = t << 4, cnt = 1;
  }
 }
 
 return tlen;
}*/

int gprs(int type)
{
 int fd;
 int pid;
 char string[100];
 int n = 0;
 /*小偷进屋*/
 char send_thief[100] = "0891683110102105F011000D91685115607830F70008000A5C0F50778FDB5C4BFF01";
 /*家里着火*/
 char send_fire[100] = "0891683110102105F011000D91685115607830F70008000A5bb691cc7740706bff01";
 /*zigbee*/
 unsigned char send_zigbee[] = {0x02,0x08,0xCB,0x01,0x00,0xD3,0x42,0x00,0x01,0x00,0x09};
 
// char send_zigbee[100]="";
// char send_zigbee[100]= "02 20 08 20 CB 20 01 20 00 20 D3 20 42 20 00 20 01 20 00 20 50";
 
// unsigned char send_zigbee[12]={(char)0X02,(char)0X08,(char)0XCB,(char)0X01,(char)0X00,(char)0XD3,(char)0X42,(char)0X00,(char)0X01,(char)0X00,(char)0X50,(char)0};
// char send_zigbee[100]= "50 00 01 00 42 D3 00 01 CB 08 02";
// unsigned char send_zigbee[1024]= {0X30,0X02,0X08,0XCB,0X01,0X00,0XD3,0X42,0X00,0X01,0X00,0X50};
// unsigned char send_zigbee[100]= {0X30,0X50,0X00,0X01,0X00,0X42,0XD3,0X00,0X01,0XCB,0X08,0X02};
//  unsigned send_zigbee[100]= {0X30,0X02,0X08,0XCB,0X01,0X00,0XD3,0X42,0X00,0X01,0X00,0X50};
// (char)0x20 ASCII 码值 0x20H 就是 空格
//    char send_zigbee[100]= {(char)0X50,(char)0X20,(char)0X00,(char)0X20,(char)0X01,(char)0X20,(char)0X00,(char)0X20,(char)0X42,(char)0X20,(char)0XD3,(char)0X20,(char)0X00,(char)0X20,(char)0X01,(char)0X20,(char)0XCB,(char)0X20,(char)0X08,(char)0X20,(char)0X02};

 /*打开串口,并设置属性(115200,8位有效数据位,无奇偶校验,1位)*/
// extern pthread_mutex_t GPRS_lock;
//   pthread_mutex_lock(&GPRS_lock);
/*fd=open_port(fd,2);
 set_opt(fd,9600,8,'N',1);
 n = write(fd,"at\r",strlen("at\r"));
 printf("write=%d\n",n);
 printf(".................\n");
    /*发送AT,返回ok*/
/* sleep(2);
 bzero(string,sizeof(string));
 n = read(fd,string,100);
 printf("read AT=%d\n",n);
 printf("read AT=%s\n",string);*/
 
 fd=open_port(fd,8);
 set_opt(fd,38400,8,'N',1);
// n = write(fd,"at\r",strlen("at\r"));
// printf("write=%d\n",n);
// printf(".................\n");
    /*发送AT,返回ok*/
// sleep(2);
// bzero(string,sizeof(string));
// n = read(fd,string,100);
// sleep(1);
// printf("read TYYS1=%d\n",n);
 //printf("read AT=%s\n",string);
// printf("read zigbee=%s\n",string);


 
    /*短信中心号码*/
 //write(fd,"AT+CSCA=\"+8613010112500\"\r",strlen("AT+CSCS=\"+8613010112500\"\r"));
 /*write(fd,"AT+CSCA=+8613010112500\r",strlen("AT+CSCS=+8613010112500\r"));
 sleep(2);
 bzero(string,sizeof(string));
 n = read(fd,string,100);
 printf("read AT+CSCA = %d\n",n);
 printf("read AT+CSCA =%s\n",string);
    */
    /*
 write(fd,"AT+CCID\r",strlen("AT+CCID\r"));
 sleep(2);
 bzero(string,sizeof(string));
 n = read(fd,string,100);
 printf("read AT+CCID %d\n",n);
 printf("read AT+CCID =%s\n",string);
 */
    /*发送目标号码*/
 //n = write(fd,"AT+CMGS=+8615510687037\r",strlen("AT+CMGS=+8615510687037\r"));
 
 /*发送设置的短信模式*/
 
/* write(fd,"AT+CMGF=0\r",strlen("AT+CMGF=0\r"));
 sleep(2);
 bzero(string,sizeof(string));
 n = read(fd,string,100);
 printf("read AT+CMGF = %d\n",n);
 printf("read AT+CMGF =%s\n",string);

 

 write(fd,"AT+CMGS=25\r",strlen("AT+CMGS=25\r"));
 sleep(2);
 bzero(string,sizeof(string));
 n = read(fd,string,50);
 printf("read AT+CMGS = %d\n",n);
 printf("read AT+CMGS =%s\n",string);
*/

 


// write(fd,send_zigbee,11);
// printf("ok\n");
 unsigned char cmd[11];
// bzero(cmd,100);
 
   
 
 /*火灾时发出的短信*/
    if(THIEF_INTO == type)
 {
  strcpy(cmd,send_thief);
 }
 
 /*盗贼进入时发出的短信*/
 
    if(FIRE == type)
 {
  strcpy(cmd,send_fire);
 }
 
 /*zigbee*/
 if(ZIGBEE== type)
 {
  write(fd,send_zigbee,11);
  strcpy(cmd,send_zigbee);//强大功能
  //printf("ok\n");
 }
  
 /*
 n = write(fd,0x02,1);
  n = write(fd,0x08,1);
  n = write(fd,0xCB,1);
  n = write(fd,0x01,1);
  n = write(fd,0x02,1);
  n = write(fd,0xD3,1);
  n = write(fd,0x42,1);
  n = write(fd,0x00,1);
  n = write(fd,0x01,1);
  n = write(fd,0x00,1);
  n = write(fd,0x09,1);*/
  
// }
 //02 08 CB 01 00 D3 42 00 01 00 09
 
/*
char* out2=new char[strlen("0208CB0100D34200010009")/2];
int count=0;
for(char *s="0208CB0100D34200010009";strlen(s)>0;s+=2)
{
if(*s>='0' && *s<='9')
out2[count]=*s-'0';
else if(*s>='A'&& *s<='F')
out2[count]=*s-'A'+10;
if(strlen(s)>1)
{
out2[count]*=16;
if(*(s+1)>='0' && *(s+1)<='9') out2[count++]+=(*(s+1)-'0');
if(*(s+1)>='A'&& *(s+1)<='F') out2[count++]+=(*(s+1)-'A'+10);
write(fd,out2,13);
}
}
delete[] out2;  
 */
// strcat(cmd,"\x1a");
 
// write(fd,cmd,11);
// write(fd,f("02 08 CB 01 00 D3 42 00 01 00 09"),12);
/*
 printf(".................\n");
 
 printf("发送cmd=%x\n",f(cmd));
// n = write(fd,&cmd[1],1);
 printf("发送cmd=%x\n",f(cmd));
// n = write(fd,&cmd[2],1);
 printf("发送cmd=%x\n",f(cmd));
// n = write(fd,&cmd[3],1);
 printf("发送cmd=%x\n",f(cmd));
// n = write(fd,&cmd[4],1);
 printf("发送cmd=%x\n",f(cmd));
// n = write(fd,&cmd[5],1);
 printf("发送cmd=%x\n",f(cmd));
// n = write(fd,&cmd[6],1);
 printf("发送cmd=%X\n",f(&cmd[6]));
// n = write(fd,&cmd[7],1);
 printf("发送cmd=%X\n",f(&cmd[7]));
// n = write(fd,&cmd[8],1);
 printf("发送cmd=%X\n",f(&cmd[8]));
// n = write(fd,&cmd[9],1);
 printf("发送cmd=%X\n",f(&cmd[9]));
// n = write(fd,&cmd[10],1);
 printf("发送cmd=%X\n",f(&cmd[10]));
// n = write(fd,&cmd[11],1);
 printf("发送cmd=%X\n",f(&cmd[11]));*/
// n = write(fd,cmd[12],strlen(cmd[12]));
// printf("发送cmd=%X\n",cmd[12]);
// n = write(fd,cmd,strlen(cmd));
// printf(".................\n");
/* 
 printf(".................begin\n");
/*
unsigned   char     a=0x02;
n = write(fd,a,1);
unsigned   char     b=0x08;
n = write(fd,b,1);
unsigned   char     c=0xCB;
n = write(fd,c,1);
unsigned   char     d=0x01;
n = write(fd,d,1);
unsigned   char     e=0x00;
n = write(fd,e,1);
unsigned   char     f=0xD3;
n = write(fd,f,1);
unsigned   char     g=0x42;
n = write(fd,g,1);
unsigned   char     h=0x00;
n = write(fd,h,1);
unsigned   char     i=0x01;
n = write(fd,i,1);
unsigned   char     j=0x00;
n = write(fd,j,1);
unsigned   char     k=0x09;*/
 /*
unsigned char a=f("02");
 int j;
 j=write(fd,&a,2);
  printf("%X\n", f("02"));
 
 unsigned char b=f("08");
 write(fd,&b,2);
  printf("%X\n", f("08"));
 
 unsigned char c=f("CB");
 write(fd,&c,2);
  printf("%X\n", f("CB"));
 
  unsigned char d=f("01");
 write(fd,&d,2);
  printf("%X\n", f("01"));
 
  unsigned char e=f("00");
 write(fd,&e,2);
  printf("%X\n", f("00"));

 unsigned char l=f("D3");
 write(fd,&l,2);
  printf("%X\n", f("D3"));
 
  unsigned char g=f("42");
 write(fd,&g,2);
  printf("%X\n", f("42"));
 
 unsigned char h=f("00");
 write(fd,&h,2);
  printf("%X\n", f("00"));
 
  unsigned char i=f("01");
 write(fd,&i,2);
  printf("%X\n", f("01"));
 
 unsigned char m=f("00");
 write(fd,&m,2);
  printf("%X\n", f("00"));
 
  unsigned char k=f("09");
 write(fd,&k,2);
  printf("%X\n", f("09"));
  write(fd,"ok",2);*/
/*  int x;
  x=write(fd,"hello world!\r",12);
 
 
 printf(".................end\n");
/*

 unsigned char *i=0x02;;
 //*i=0x02;
 strcat(cmd,&i);
 n = write(fd,cmd,1);
 printf("发送cmd=%x\n",cmd[0]);
 *i=0x08;
 strcat(cmd,&i);
 n = write(fd,cmd,1);
 printf("发送cmd=%x\n",cmd[1]);
 *i=0xcb;
 strcat(cmd,&i);
 n = write(fd,cmd,1);
 printf("发送cmd=%x\n",cmd[2]);
 *i=0x01;
 strcat(cmd,&i);
 n = write(fd,cmd,strlen(cmd));
 printf("发送cmd=%x\n",cmd[3]);
 *i=0x00;
 strcat(cmd,&i);
 n = write(fd,cmd,strlen(cmd));
 printf("发送cmd=%x\n",cmd[4]);
 *i=0xd3;
 strcat(cmd,&i);
 n = write(fd,cmd,strlen(cmd));
 printf("发送cmd=%x\n",cmd[5]);
 *i=0x42;
 strcat(cmd,&i);
 n = write(fd,cmd,strlen(cmd));
 printf("发送cmd=%x\n",cmd[6]);
 *i=0x00;
 strcat(cmd,&i);
 n = write(fd,cmd,strlen(cmd));
 printf("发送cmd=%x\n",cmd[7]);
 *i=0x01;
 strcat(cmd,&i);
 n = write(fd,cmd,strlen(cmd));
 printf("发送cmd=%x\n",cmd[8]);
 *i=0x00;
 strcat(cmd,&i);
 n = write(fd,cmd,strlen(cmd));
 printf("发送cmd=%x\n",cmd[9]);
 *i=0x09;
 strcat(cmd,&i);
 n = write(fd,cmd,strlen(cmd));*/
/* int j=0;
 for(j=0;j<11;j++)
 {
  printf("发送cmd=%x\n",(cmd[j]));
  write(fd,cmd[j],strlen(cmd[j]));
 }
*/
 
 
 //printf("发送cmd=%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x\n",cmd[0],cmd[1],cmd[2],cmd[3],cmd[4],cmd[5],cmd[6],cmd[7],cmd[8],cmd[9],cmd[10]);
/*
 printf("发送cmd=%x\n",cmd[0]);
  printf("发送cmd=%x\n",cmd[1]);
   printf("发送cmd=%x\n",cmd[2]);
    printf("发送cmd=%x\n",cmd[3]);
     printf("发送cmd=%x\n",cmd[4]);
      printf("发送cmd=%x\n",cmd[5]);
       printf("发送cmd=%x\n",cmd[6]);
        printf("发送cmd=%x\n",cmd[7]);
         printf("发送cmd=%x\n",cmd[8]);
          printf("发送cmd=%x\n",cmd[9]);
           printf("发送cmd=%x\n",cmd[10]);*/
          
// n = write(fd,send_zigbee,strlen(send_zigbee));
   

/*int CSerialPortTestDlg::Str2Hex(CString str, char* data)
{
 int t, t1;//int hexData, lowhexData;  
 int rlen=0, len=str.GetLength();
 //data.SetSize(len/2);
 for(int i=0; i<len; )//注意循环条件
 {
 char lstr, hstr = str[i];//获得地址的高8位和低8位  
 if(hstr ==' ')
 {
 ++i;
 continue;
 }
 i++;
 if(i>=len)
 break;
 lstr= str[i];
 t = HexChar(hstr);
 t1= HexChar(lstr);
 if((t==16)|| (t1==16))
 break;
 else 
 t= t*16+t1;
 ++i;
 data[rlen]= (char)t;
 ++rlen;
}*/

//    CString zigbee;
//    zigbee("02 08 CB 01 00 D3 42 00 01 00 09");
   
//    int len = Str2Hex(str_Message, data);
   
//    n = write(fd,zigbee,strlen(zigbee));
//    printf("发送send_zigbee=%x\n",send_zigbee);
//    n = write(fd,send_zigbee,strlen(send_zigbee));
//    unsigned char Buffer[1024];
//  unsigned char *src_buf;
//   src_buf = Buffer;
   
//   Buffer[0]=0x02;
 //   Buffer[1]=0x20;
   
//   Buffer[1]=0x08;
//    Buffer[3]=0x20;
   
//    Buffer[2]=0xCB;
// Buffer[5]=0x20;
 
//    Buffer[3]=0x01;
// Buffer[7]=0x20;
 
//    Buffer[4]=0x00;
// Buffer[9]=0x20;
 
//    Buffer[5]=0xD3;
// Buffer[11]=0x20;
 
//    Buffer[6]=0x42;
// Buffer[13]=0x20;
 
//  Buffer[7]=0x00;
//   Buffer[15]=0x20;
   
// Buffer[8]=0x01;
// Buffer[17]=0x20;
 
// Buffer[9]=0x00;
// Buffer[19]=0x20;
 
// Buffer[10]=0x50;
// Buffer[21]=0x00;

 
//    j=write(fd,Buffer,11);
//    printf("发送Buffer=%x\n",Buffer);
//    printf("---------------------------\n");
/*  if (x == -1)
    {
   printf("write operation is error!\n");
    }
*/
   
   /*
 strcat(cmd1,(char)0X02);strcat(cmd1,(char)0X20);
    strcat(cmd1,(char)0X08);strcat(cmd1,(char)0X20);
    strcat(cmd1,(char)0XCB);strcat(cmd1,(char)0X20);
    strcat(cmd1,(char)0X01);strcat(cmd1,(char)0X20);
    strcat(cmd1,(char)0X00);strcat(cmd1,(char)0X20);
    strcat(cmd1,(char)0XD3);strcat(cmd1,(char)0X20);
    strcat(cmd1,(char)0X42);strcat(cmd1,(char)0X20);
    strcat(cmd1,(char)0X00);strcat(cmd1,(char)0X20);
    strcat(cmd1,(char)0X01);strcat(cmd1,(char)0X20);
    strcat(cmd1,(char)0X00);strcat(cmd1,(char)0X20);
    strcat(cmd1,(char)0X50);*/
  
//  write(fd,cmd1,strlen(cmd1));
//  printf("发送cmd=%s,datalength=%d\n",cmd1,strlen(cmd1));
   
   /*
 write(fd,0x02,strlen(0X02));
    write(fd,0x08,strlen(0X08));
    write(fd,0xCB,strlen(0XCB));
    write(fd,0x01,strlen(0X01));
    write(fd,0X00,strlen(0X00));
    write(fd,0XD3,strlen(0XD3));
    write(fd,0X42,strlen(0X42));
    write(fd,0X00,strlen(0X00));
    write(fd,0X01,strlen(0X01));
    write(fd,0X00,strlen(0X00));
    write(fd,0X50,strlen(0X50));*/
   
// sleep(2);
 /*查看网络注册*/
/* printf("search the internet...............\n");
 write(fd,"AT+CREG=?\r",strlen("AT+CRGE=?\r"));
 sleep(2);
 bzero(string,sizeof(string));
 n = read(fd,string,50);
 printf("read AT+CRGE = %d\n",n);
 printf("read AT+CRGE =%s\n",string);
*/
 /*拨号  ATD + 电话号码(别忘了加";")*/
/* printf("call..................\n");
 write(fd,"ATD +8615510687037;\r",strlen("ATD +8615510687037;\r"));
 sleep(2);
 bzero(string,sizeof(string));
 n = read(fd,string,50);
 printf("read ATD = %d\n",n);
 printf("read ATD =%s\n",string);
*/ 
/* if(n < 0)
 {
  printf("send message error\n");
  return -1;
 }
 printf("write message = %d\n",n);
 printf("send end\n");
 sleep(1);
    close(fd);
*/


//    pthread_mutex_unlock(&GPRS_lock);
 /*sleep(2);
 bzero(string,sizeof(string));
 n = read(fd,string,100);
 printf("read message %d\n",n);
 printf("read message =%s\n",string);
    */
    close(fd);
 return 0;
}
 
 int main(void)
 {
  
  //gprs(FIRE);
  gprs(ZIGBEE);
  //gprs(THIEF_INTO);
  return 0;
 }
 
 


 

<think>嗯,用户现在遇到了“open_port /dev/ttyUSB0 ERROR !”的问题。首先,我需要确定这个错误通常发生在什么情况下。通常,当程序尝试打开串口设备/dev/ttyUSB0时,可能会因为权限不足、设备不存在、被其他进程占用或者驱动问题导致无法打开。 首先,用户可能没有权限访问/dev/ttyUSB0。在Linux系统中,串口设备通常属于dialout组,用户需要加入该组才能访问。因此,我应该建议用户检查他们的用户组,并添加自己到dialout组,然后重新登录或者重启。 其次,设备可能没有被正确识别。用户可能没有正确连接USB设备,或者设备驱动没有正确加载。这时候,应该让用户运行ls /dev/ttyUSB*来确认设备是否存在,或者检查dmesg | grep tty的输出,看看系统是否识别到了设备。 另外,可能有其他程序占用了该串口,比如之前运行的程序没有正确释放资源。用户可以使用lsof /dev/ttyUSB0来查找占用进程并终止它。 还有可能是波特率或其他串口参数设置不正确,导致无法打开。这时候需要用户确认程序中的参数是否与设备要求的匹配。 如果用户是第一次使用该设备,可能需要安装相应的驱动。比如某些USB转串口芯片需要安装额外的驱动,如FTDI的芯片需要ftdi_sio驱动。 此外,检查硬件连接是否松动,更换USB端口或者数据线也是一个常见的解决方法。 最后,如果所有方法都试过了还是不行,可能需要检查内核日志dmesg是否有相关的错误信息,或者尝试更新系统和驱动。 需要一步步引导用户排查问题,从最简单的权限问题开始,逐步深入到驱动和硬件问题,确保用户能理解每个步骤的目的和执行方法。</think>遇到 `open_port /dev/ttyUSB0 ERROR` 错误时,通常表示程序无法访问指定的串口设备。以下是系统性解决方案: --- ### **一、原因分析** 1. **权限不足** Linux 系统默认限制普通用户直接访问硬件设备(如串口)。 2. **设备不存在** USB 未正确连接、驱动未加载或设备号不匹配(如 `/dev/ttyUSB0` 实际为 `/dev/ttyUSB1`)。 3. **设备被占用** 其他程序(如串口调试工具)已锁定该端口。 4. **波特率/参数不匹配** 程序设定的波特率、数据位等参数与设备不兼容。 --- ### **二、解决方案** #### 1. **检查设备是否存在** ```bash ls /dev/ttyUSB* # 查看所有 USB 串口设备 dmesg | grep tty # 检查内核是否识别到设备(插入 USB 后立即执行) ``` - 若设备未列出,尝试重新插拔 USB 或更换数据线。 #### 2. **添加用户权限** ```bash sudo usermod -aG dialout $USER # 将当前用户加入 dialout 组 sudo chmod 666 /dev/ttyUSB0 # 临时开放权限(重启后失效) ``` - **重启系统**使组权限生效。 #### 3. **解除设备占用** ```bash sudo lsof /dev/ttyUSB0 # 查看占用进程 sudo kill -9 <PID> # 终止占用进程(替换 <PID> 为实际进程号) ``` #### 4. **验证参数配置** - 检查程序代码中的串口参数(如波特率常用 `115200`、`9600`),确保与硬件一致: ```python # Python 示例(PySerial 库) import serial ser = serial.Serial( port=&#39;/dev/ttyUSB0&#39;, baudrate=115200, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS ) ``` #### 5. **驱动问题排查** - 确认 USB 转串口芯片型号(如 CH340、CP2102、FT232)并安装驱动: ```bash lsusb # 列出 USB 设备详情 sudo modprobe ch341 # 手动加载驱动(以 CH340 为例) ``` --- ### **三、扩展测试** | 测试方法 | 命令/操作 | 预期结果 | |---------------------------|-------------------------------|------------------------------| | **基础通信测试** | `sudo cat /dev/ttyUSB0` | 插入设备后显示随机数据 | | **回环测试** | 短接 USB 转串口的 TX 和 RX 引脚 | 发送数据后应能收到相同数据 | | **第三方工具验证** | 使用 `cutecom` 或 `minicom` | 确认参数是否匹配硬件 | --- ### **四、常见硬件兼容性问题** | 芯片型号 | 驱动方案 | 备注 | |-----------|-----------------------------------|-------------------------------| | **CH340** | `sudo apt install ch340con` | 部分旧内核需手动编译驱动 | | **CP210x**| 内核默认支持 | 检查 `lsusb` 显示 `Silicon Labs` | | **FTDI** | 内核默认支持 | 需注意假冒芯片兼容性问题 | --- ### **五、错误场景示例** ```bash # 错误:无权限访问 /dev/ttyUSB0 open_port /dev/ttyUSB0: Permission denied # 错误:设备不存在 open_port /dev/ttyUSB0: No such file or directory # 错误:参数不匹配 open_port /dev/ttyUSB0: Invalid argument ``` --- ### **六、终极调试方案** 1. 更换 USB 端口或数据线 2. 在另一台电脑上测试设备 3. 使用 Windows 系统 + PuTTY 交叉验证硬件是否损坏 --- 若问题仍未解决,请提供以下信息: 1. 操作系统版本(`lsb_release -a`) 2. USB 转串口芯片型号(`lsusb` 输出) 3. 完整的错误日志
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

doublewei1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值