從 ttyS0 讀取和寫入

從 ttyS0 讀取和寫入

我有一個 Raspberry PI Zero W 透過 USB 連接到我的虛擬機,可以/dev/ttyS0在 PC 和 RPI 下找到。目前我正在嘗試透過 USB 電纜將一些內容從 RPI 發送到虛擬機器 (PC)。

我正在嘗試使用以下程式碼讀取連接埠:

    #include <stdio.h>   /* Standard input/output definitions */    
    #include <string.h>  /* String function definitions */    
    #include <unistd.h>  /* UNIX standard function definitions */    
    #include <fcntl.h>   /* File control definitions */    
    #include <errno.h>   /* Error number definitions */    
    #include <termios.h> /* POSIX terminal control definitions */    

    /*     * 'open_port()' − Open serial port 1.     *     
    * Returns the file descriptor on success or −1 on error.     */    

   int fd; /* File descriptor for the port */

   int open_port(void)    
   {            
     fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);   

     if(fd == -1) 
     {       
       /*        * Could not open the port.        */        
       perror("open_port: Unable to open /dev/ttyS0 − ");      
     }      
     else        
      fcntl(fd, F_SETFL, FNDELAY);      

    return (fd);    
  }

  int close_port(void)
  {
    close(fd);
    return (fd);
  }


  int main()
  {
    printf("Serial reader has started...\n\n");
    while(1)
    {
      open_port();
      close_port();
    }

    return 0;
  }

在 RPI 方面,我製作了一個小 bash 腳本,它發送字元 1:

while :
do
    echo "sending character 1 to /dev/ttyS0"
    echo "1" > /dev/ttyS0
done

然而,儘管 bash 腳本和 c 程式都在連續循環中運行,但我在 PC 端沒有收到任何資訊。

可能是什麼原因?

筆記: RPI 可以透過 USB 從虛擬機器訪問,因為我在虛擬機器上使用 SSH 來存取 RPI。所以是的,VM 應該已經配置為存取 USB 連接埠。

編輯: 我嘗試將程式碼更改為此,我在其中實作了函數 read(),但是我仍然沒有看到任何更改:

    #include <stdio.h>   /* Standard input/output definitions */    
    #include <string.h>  /* String function definitions */    
    #include <unistd.h>  /* UNIX standard function definitions */    
    #include <fcntl.h>   /* File control definitions */    
    #include <errno.h>   /* Error number definitions */    
    #include <termios.h> /* POSIX terminal control definitions */    

    /*     * 'open_port()' − Open serial port 1.     *     
    * Returns the file descriptor on success or −1 on error.     */    

   int fd; /* File descriptor for the port */
   unsigned char bufptr;
   int reader;

   int open_port(void)    
   {            
     fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);   

     if(fd == -1) 
     {       
       /*        * Could not open the port.        */        
       perror("open_port: Unable to open /dev/ttyS0 − ");      
     }      
     else
     {        
      fcntl(fd, F_SETFL, FNDELAY);
      reader = read(fd, &bufptr, 1);
        if (reader > 0)
        {
          write(STDOUT_FILENO, &bufptr, 1);  
        }
     }

    return (fd);    
  }

  int close_port(void)
  {
    close(fd);
    return (fd);
  }


  int main()
  {
    printf("Serial reader has started...\n\n");
    while(1)
    {
      open_port();
      close_port();
    }

    return 0;
  }

答案1

在您的編輯中,您新增了從連接埠讀取open_port()功能的程式碼。雖然它看起來可能有效,但這是一種糟糕的風格:現在該open_port()函數是特定於該程式的需求的,並且不再容易在未來的專案中不經修改地挑选和重複使用。且函數的名稱不再準確地描述函數的作用。

我不相信您的串行連接設定是否正確:您說您正在使用虛擬機器並且涉及​​ USB,但您似乎/dev/ttyS0在兩端都使用。這是指實體串行端口,而不是基於 USB 的串行端口。

也許您已將虛擬化軟體配置為將實際的實體序列埠或主機的 USB 串列轉換器驅動程式產生的序列埠連接到 VM /dev/ttyS0:如果這是真的,那麼這可能會在 PC 端運作。但那就是不是預設值:您必須在虛擬化軟體中進行配置,否則它將無法運作。

更常見的配置是配置虛擬化軟體以允許 VM 整體存取 USB 串行轉換器的 USB 端:然後它將在 VM 中顯示為類似的內容/dev/ttyUSB0(取決於串行端口的確切類型)轉換器)。

在RasPi端,/dev/ttyS0 不存在在 Pi Zero W 的預設配置中 - 典型的序列埠是/dev/ttyAMA0,但在預設配置中它由藍牙功能使用。如果您已將 USB 序列轉換器的 USB 端插入 RasPi,那麼它/dev/ttyUSB0也會顯示為此處。

由於您的 RasPi 端腳本不會檢查設備是否存在,因此它可能創建了一個名為 的文件,其中/dev/ttyS0包含一行帶有數字的文件。1在 RasPi 上執行此命令以查看其是否/dev/ttyS0為有效的串行設備:

 test -c /dev/ttyS0 && echo "Maybe valid" || echo "Definitely not correct"

如果您在 RasPi 端使用實體串行連接(/dev/ttyS0/dev/ttyAMA0),據我所知,您應該在 RasPi Zero W 上焊接 40 針連接器,並將某些東西插入該連接器的針腳 8 和 10。您還必須使用raspi-config來啟用串行埠存取。

如果您可以透過 SSH 存取 RasPi,則表示您擁有一個網路連接:它根本沒有說明任何有關連接狀態的信息連續劇聯繫。

相關內容