2017-02-13 85 views
10

我嘗試使用,但沒有成功ARM:通過UART讀取MODBUS數據未能

連接器

連接到ARM板

能源功率計< --rx/TX電纜從設備 - > SENA RS485適配器< --serial男/男性適配器+串行到迷你串行電纜 - > ARM板微型串行端口

看到設置的圖像:

設備樹中使用: am335x-SBC-t335.dts

設備樹資源:http://get-album.com/dts/

從屬設備連接到PC

能源功率計< --2線RX/TX - > SENA RS485適配器< - > PC

注:在板的微型串行端口是用於串行控制檯通信的相同端口(上波特115200) - 和這工作沒有問題

下面是AC碼,與使用libmodbus庫

libmodbus_test的讀取來自所連接的從動裝置中的第一寄存器中。Ç - 閱讀和打印來自該裝置的第一reigster:從在ARM板上運行libmodbus_test輸出]

[email protected]:~/new# gcc -I /usr/include/modbus/ libmodbus_test.c -o libmodbus_test -lmodbus 
[email protected]:~/new# ./libmodbus_test /dev/ttyO0 
created new rtu... 
Opening /dev/ttyO0 at 9600 bauds (N, 8, 1) 
ModBus connected ! 
[1F][03][00][01][00][02][96][75] 
Waiting for a confirmation... 
ERROR Connection timed out: select 

#include <sys/types.h> 
#include <string.h> 
#include <modbus.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <errno.h> 

#define MODBUS_DEVICE "/dev/ttyS2" 
#define MODBUS_STOP_BIT 1 
#define MODBUS_DATA_BIT 8 
#define MODBUS_START_BIT 1 
#define MODBUS_PARITY 'N' 

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

    const char *dev_path = MODBUS_DEVICE; 
    uint16_t result[2]; 
    int slave_nr = 31, baud = 9600; 
    modbus_t *mb; 

    if (argc == 2) { 
     dev_path=argv[1]; 
    } 

    mb = modbus_new_rtu(dev_path, baud, MODBUS_PARITY, MODBUS_DATA_BIT, MODBUS_STOP_BIT); 
    if (mb == NULL) { 
     printf("error creating libmodbus rtu\n"); 
     return -1; 
    } 
    printf("created new rtu...\n"); 
    modbus_set_debug(mb, 1); 
    if (modbus_connect(mb) < 0){ 
     printf("modbus error: %s\n", modbus_strerror(errno)); 
     modbus_close(mb); 
     modbus_free(mb); 
     return -1; 
    } 

    modbus_set_slave(mb, slave_nr); 

    printf("ModBus connected !\n"); 

    if (modbus_read_registers(mb, 0x1, 2, result) < 0) { 
     printf("error reading bits: %s\n", modbus_strerror(errno)); 
     modbus_close(mb); 
     modbus_free(mb); 
     return -1; 
    } 

    printf("successfully red integer: %d: %X (hex)\n", result[0], result[0]); 

    modbus_free(mb); 
    return 0; 
} 

[輸出從在PC上運行libmodbus_test]

[email protected]:~/new# modbus gcc -I /usr/local/include/modbus libmodbus_test.c -o libmodbus_test -lmodbus 
[email protected]:~/new# ./libmodbus_test /dev/ttyS2 
created new rtu... 
Opening /dev/ttyS2 at 9600 bauds (N, 8, 1) 
ModBus connected ! 
[1F][03][00][01][00][02][96][75] 
Waiting for a confirmation... 
<1F><03><04><00><DD><00><DD><54><51> 
successfully red integer: 221: DD (hex) 

當從ARM板執行libmodbus_test時,在PC上運行相同的程序時select()總是返回0 ,它工作得很好=>從設備返回數據。

使用的termios也未能得到相似的結果

termios_test.c

#include <sys/select.h> 
#include <termios.h> 
#include <stdio.h> 
#include <fcntl.h> 
#include <unistd.h> 
#include <sys/time.h> 
#include <sys/types.h> 
#include <string.h> 
#include <stdint.h> 
#include <linux/serial.h> 
#include <sys/ioctl.h> 

static const uint8_t table_crc_hi[] = { 
    0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 
    0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 
    0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 
    0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 
    0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 
    0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 
    0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 
    0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 
    0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 
    0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 
    0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 
    0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 
    0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 
    0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 
    0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 
    0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 
    0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 
    0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 
    0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 
    0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 
    0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 
    0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 
    0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 
    0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 
    0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 
    0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 
}; 


/* Table of CRC values for low-order byte */ 
static const uint8_t table_crc_lo[] = { 
    0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 
    0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 
    0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 
    0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 
    0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4, 
    0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, 
    0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 
    0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 
    0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 
    0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 
    0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED, 
    0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26, 
    0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 
    0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 
    0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 
    0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 
    0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 
    0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5, 
    0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 
    0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 
    0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 
    0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 
    0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B, 
    0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C, 
    0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 
    0x43, 0x83, 0x41, 0x81, 0x80, 0x40 
}; 


void calc_crc(uint8_t *buffer, ssize_t length, uint8_t *crc_hi_arg, uint8_t *crc_lo_arg) { 

    uint8_t crc_hi = 0xff; 
    uint8_t crc_lo = 0xff; 
    unsigned int i; 

    while (length--) { 
     i = crc_hi^*buffer++; 
     crc_hi = crc_lo^table_crc_hi[i]; 
     crc_lo = table_crc_lo[i]; 
    } 

    *crc_hi_arg = crc_hi; 
    *crc_lo_arg = crc_lo; 

} 

int main(int argc, char **argv){ 

    char *dev_path = "/dev/ttyS2"; 
    if (argc == 2) { 
     dev_path = argv[1]; 
    } 
    uint8_t write_data[8]; 
    int fd,write_len,select_ret, bytes_avail, status; 
    struct termios config; 
    char c; 
    uint8_t crc_hi, crc_lo; 
    fd_set activefs, tmpfs;; 
    struct timeval timeout; 

    timeout.tv_sec = 0; 
    timeout.tv_usec= 500000; 

    fd = open(dev_path, O_RDWR | O_NOCTTY | O_NDELAY | O_EXCL); 

    if (fd == -1){ 
     perror("open"); 
     return 1; 
    } 

    FD_ZERO(&tmpfs); 
    FD_SET(fd, &tmpfs); 

    printf("opened device\n"); 
    if (tcgetattr(fd, &config) < 0) { close(fd); return -1 } 

    if (cfsetispeed(&config, B9600) < 0 || cfsetospeed(&config, B9600) < 0) { 
     printf("cant setting speed!\n"); 
     close(fd); 
     return 1; 
    } 


    config.c_cflag |= (CREAD | CLOCAL); 
    config.c_cflag &=~ CSIZE; 
    config.c_cflag &=~ CSTOPB; 
    config.c_cflag &=~ PARENB; 
    config.c_cflag |= CS8; 

    config.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); 

    config.c_iflag &= ~INPCK; 
    config.c_iflag &= ~(IXON | IXOFF| IXANY); 

    config.c_oflag &= ~OPOST; 


    config.c_cc[VMIN] = 0; 
    config.c_cc[VTIME] = 0; 

    if (tcsetattr(fd, TCSANOW, &config) < 0) { 
     printf("cant apply config!\n"); 
     close(fd); 
     return 1; 
    } 


    write_data[0] = 0x1f; // slave addr 
    write_data[1] = 0x03; // function 
    write_data[2] = 0x00; // data address of first coil (8b) 
    write_data[3] = 0x01; // data address of first coil (8b) 
    write_data[4] = 0x00; // num of coils requested 
    write_data[5] = 0x01; // num of coils requested 
    calc_crc(write_data, 6, &crc_hi, &crc_lo); 
    write_data[6] = crc_hi; 
    write_data[7] = crc_lo; 

    printf("data: [0x%x][0x%x][0x%x][0x%x][0x%x][0x%x][0x%x][0x%x]", write_data[0], write_data[1], write_data[2], write_data[3], write_data[4], write_data[5], write_data[6], write_data[7]); 

    while (1) { 

     sleep(1); 
     write_len= write(fd, write_data, 8); 
     activefs = tmpfs; 
     select_ret = select(1, &activefs, NULL, NULL, &timeout); 
     if (select_ret < 0) { 
      perror("select"); 
      return 1; 
     } 

     if (select_ret > 0) { 
      printf("select returned %d\n", select_ret); 
      if (read(fd, &c, 1) < 0) { 
       perror("read"); 
      } else { 
       printf("received: %d\n", c); 
      } 
     } 

    } 


} 

[從termios.c輸出上ARM板]

[email protected]:~/new# ./termios /dev/ttyO0 
opened device 

嘗試...選擇不斷返回0

[從termios.c輸出的PC]

$ gcc -o termios_test termios_test.c 
$ ./termios_test /dev/ttyS2 
opened device 
data: [0x1f][0x3][0x0][0x1][0x0][0x1][0xd6][0x74]select returned 1 
received: 31 
select returned 1 

沒關係的價值觀,有一個數據交換,這就是我想用板

我試圖通過傳遞RS485了pcntl屬性要達到什麼,但同樣的結果發生 termios_rs485_test.c:http://pastebin.com/RWtHtjLF

板與PC之間的連接是通過超小型串行DB9電纜做,我可以成功地往返於板讀/寫數據。如何從RS485適配器讀取數據從未成功?我應該在哪裏尋找解決方案?

以下是有關板/驅動器的一些信息的/ etc

[email protected]:~/modbus# uname -a 
Linux cm-debian 4.4.0-cm-t335-5.1 #98 SMP Thu Sep 1 15:12:31 IDT 2016 armv7l GNU/Linux 

[email protected]:~/new# dmesg | grep -i --color '\(serial\|tty\|uart\)' 
[ 0.000000] Kernel command line: console=ttyO0,115200n8 root=ubi0:rootfs rw rootfstype=ubifs ubi.mtd=rootfs 
[ 0.771007] Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled 
[ 0.780286] omap_uart 44e09000.serial: no wakeirq for uart0 
[ 0.780329] of_get_named_gpiod_flags: can't parse 'rts-gpio' property of node '/ocp/[email protected][0]' 
[ 0.780960] 44e09000.serial: ttyO0 at MMIO 0x44e09000 (irq = 155, base_baud = 3000000) is a OMAP UART0 
[ 1.543031] console [ttyO0] enabled 
[ 1.550036] omap_uart 48022000.serial: no wakeirq for uart1 
[ 1.556099] of_get_named_gpiod_flags: can't parse 'rts-gpio' property of node '/ocp/[email protected][0]' 
[ 1.556764] 48022000.serial: ttyO1 at MMIO 0x48022000 (irq = 156, base_baud = 3000000) is a OMAP UART1 
[ 2.953486] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1 
[ 2.973176] usb usb1: SerialNumber: musb-hdrc.0.auto 
[ 3.572722] usb 1-1: New USB device strings: Mfr=0, Product=0, SerialNumber=0 
[ 6.689030] systemd[1]: Expecting device dev-ttyO0.device... 
[ 7.210727] systemd[1]: Starting system-getty.slice. 
[ 7.235407] systemd[1]: Created slice system-getty.slice. 
[ 7.241302] systemd[1]: Starting system-serial\x2dgetty.slice. 
[ 7.265277] systemd[1]: Created slice system-serial\x2dgetty.slice. 
[ 7.925632] systemd[1]: Starting LSB: controls configuration of serial ports... 
[ 8.485680] systemd[1]: Started LSB: controls configuration of serial ports. 
[ 14.840532] pinctrl-single 44e10800.pinmux: pin 44e10978.0 already requested by 48022000.serial; cannot claim for 481cc000.can 
[ 14.895866] pinctrl-single 44e10800.pinmux: pin 44e10980.0 already requested by 48022000.serial; cannot claim for 481d0000.can 


[email protected]:~/modbus# setserial -a /dev/ttyO0 
/dev/ttyO0, Line 0, UART: undefined, Port: 0x0000, IRQ: 155 
     Baud_base: 3000000, close_delay: 50, divisor: 0 
     closing_wait: 3000 
     Flags: spd_normal 

[email protected]:~/new# setserial -a /dev/ttyS2 
/dev/ttyS2, Line 2, UART: unknown, Port: 0x0000, IRQ: 0 
     Baud_base: 0, close_delay: 50, divisor: 0 
     closing_wait: 3000 
     Flags: spd_normal 

[email protected]:~/new# setserial -a /dev/ttyS1 
/dev/ttyS1, Line 1, UART: unknown, Port: 0x0000, IRQ: 0 
     Baud_base: 0, close_delay: 50, divisor: 0 
     closing_wait: 3000 
     Flags: spd_normal 

[email protected]:~/new# setserial -a /dev/ttyS0 
/dev/ttyS0, Line 0, UART: unknown, Port: 0x0000, IRQ: 0 
     Baud_base: 0, close_delay: 50, divisor: 0 
     closing_wait: 3000 
     Flags: spd_normal 


[email protected]:~/modbus# lsmod 
Module     Size Used by 
sha256_generic   9731 1 
hmac     2866 1 
drbg     13731 1 
ctr      3673 2 
ccm      7928 2 
arc4     2000 2 
wl12xx     57190 0 
wlcore    180594 1 wl12xx 
mac80211    605465 2 wl12xx,wlcore 
cfg80211    492985 2 mac80211,wlcore 
snd_soc_davinci_mcasp 15953 2 
snd_soc_tlv320aic23_i2c  2092 1 
snd_soc_simple_card  7474 0 
snd_soc_tlv320aic23 10191 1 snd_soc_tlv320aic23_i2c 
snd_soc_edma   1309 1 snd_soc_davinci_mcasp 
snd_soc_core   158330 5 snd_soc_davinci_mcasp,snd_soc_edma,snd_soc_tlv320aic23_i2c,snd_soc_tlv320aic23,snd_soc_simple_card 
snd_pcm_dmaengine  5548 1 snd_soc_core 
snd_pcm    92743 4 snd_soc_davinci_mcasp,snd_soc_core,snd_soc_tlv320aic23,snd_pcm_dmaengine 
c_can_platform   6650 0 
c_can     9638 1 c_can_platform 
wlcore_spi    5086 0 
can_dev    12315 1 c_can 
ti_am335x_adc   5635 0 
snd_timer    21413 1 snd_pcm 
kfifo_buf    3452 1 ti_am335x_adc 
snd     55936 3 snd_soc_core,snd_timer,snd_pcm 
industrialio   40286 2 ti_am335x_adc,kfifo_buf 
evdev     13187 0 
omap_wdt    5293 0 
soundcore    1339 1 snd 


[email protected]:~/new# cat /proc/cpuinfo 
processor  : 0 
model name  : ARMv7 Processor rev 2 (v7l) 
BogoMIPS  : 597.60 
Features  : half thumb fastmult vfp edsp thumbee neon vfpv3 tls vfpd32 
CPU implementer : 0x41 
CPU architecture: 7 
CPU variant  : 0x3 
CPU part  : 0xc08 
CPU revision : 2 

Hardware  : Generic AM33XX (Flattened Device Tree) 
Revision  : 0000 
Serial   : 0000000000000000 

[email protected]:~/new# cat /proc/consoles 
ttyO0    -W- (EC p ) 250:0 

[email protected]:/etc# cat debian_version 
8.2 

任何幫助十分讚賞 感謝

UPDATE

雖然連接超微型串行DB9電纜在電路板上,我運行了termios_test.c,在運行時,我在電纜的中間插入了一個金屬片(TX),我可以看到屏幕上顯示垃圾數據(有時!)。我把雄 - 雄適配器插入電纜並再次觸及中間的引腳,我可以再次看到垃圾數據。

我做的另一件事是將從屬設備連接到SENA RS485適配器,並在接觸金屬時使用適配器中間引腳的引腳上的金屬片使TX引腳開啓。沒有引腳會打開RX引導。將該RS485適配器連接到PC的COM端口時,將數據發送到該端口會使RX LED閃爍。我開始懷疑主板沒有正確寫入RS485適配器,或者引腳未正確映射。我應該從哪裏出發?這可能是一個真正的軟件問題嗎?

+1

聽起來像systemd也在/ dev/ttyO0上啓動getty。內核參數使用ttyO0作爲內核控制檯。嘗試擺脫該配置 – nos

+0

從bootargs中刪除了/ dev/ttyO0,但是這也不起作用,結果相同 – Smokie

+2

您是否可以指向正在使用的設備樹文件?看起來你在ARM板上運行'CAN'(我猜不是在PC上),這些不同的協議可能會聲稱UART。一個基本的測試是連接一個環回電纜(或直接連接到一個PC機交叉)並運行mini-com等,看看你可以使用這個端口。你做到了嗎?這消除了你的代碼,設備電壓,linux/init配置等問題。分而治之總是不錯的。有很多層可能出錯,所以人們只能猜測。 –

回答

7

termios_test.c中發現了兩個軟件問題。第一個問題與錯過tcgetattr()有關。第二個是select()的第一個參數必須是1,而不是fd + 1。現在他們修好了,代碼仍然不能用於SENA RS485。

Artless Noise建議將ARM板連接到PC並檢查ARM板上的UART是否配置正確。 Smokie使用超小型串行至DB9電纜將ARM連接至PC,並確認termios_test.c可以向Windows PC發送和接收數據。

現在,我認爲問題在於ARM與SENA的物理連接。用於連接ARM與PC的超小型串行至DB9電纜是一種交叉電纜。它將ARM RX引腳連接到PC TX引腳,反之亦然。 SENA RS485適配器旨在直接連接到PC,無需任何電纜。它具有直接連接:PC TX引腳連接到SENA TX引腳,PC RX引腳連接到SENA RX引腳。 ARM使用超小型串行至DB9電纜和公 - 母型COM適配器連接至SENA。 Male - Male COM適配器不改變引腳順序,所以TX引腳變成TX引腳。所以在連接ARM TX引腳變得錯誤連接到SENA RX引腳。

爲了使電路圖工作,必須使用COM null調制解調器電纜代替Male - Male COM適配器。它基本引出線可能被下列:

ARM side        SENA side 
TXT pin 3      <--> RXD pin 2 
RXD pin 2      <--> TXT pin 3 
GND        <--> GND 
RTS pin 7 (leave unconnected)  +-> RTS pin 7 
            | 
CTS pin 8 (leave unconnected)  +-> CTS pin 8 
            | 
DTR pin 4 (leave unconnected)  +--> DTR pin 4 (to emulate the same behavior as PC does) 
DCD pin 1 (leave unconnected)  (leave unconnected) DCD pin 1 
DSR pin 6 (leave unconnected)  (leave unconnected) DSR pin 6 

如果SENA使用硬件流控制,則RTS和DTR輸入必須連接到CTS輸出。如果不是,他們可能不會連接。我建議首先連接RXD,TXD和GND信號,如果不行,請連接RTS,CTS和DTR引腳。

將RTS和CTS引腳連接到ARM以實現硬件流控制是可能的,但這並不意味着可能。由於SENA RS485的TX/RX速度與UART速度相同。無論如何,應該做出以下更改:安裝R44和R45(未安裝在ARM板上),並修改ARM板DTS文件(現在它們用作I2C1引腳)中的RTS/CTS引腳,並在軟件中設置UART以使用流控制。

如果有人在ARM上聲稱UART,您會在數據流中看到意外的字符(例如,如果ARM使用UART0作爲控制檯,您將在ARM引導期間看到SENA TX引腳閃爍)。或者,如果使用UART進行getty,您將在數據流中看到'login:'或'login incorrect'刺。此外,ARM引導ROM可能會向UART打印一些字符串,並且不能禁用該行爲。 U-boot可能使用UART作爲控制檯並輸出橫幅字符串。準備好這些數據將進入RS485並以某種方式影響它的工作。

+0

你說得對,但這不是問題。 – Smokie

+2

你也傳遞無效的參數來選擇。第一個參數必須是1,而不是fd + 1。並感謝downvote。 – alexander

+0

downvoted因爲這真的屬於意見部分,它沒有貢獻找到解決方案... – Smokie