Обмен AT-командами с / dev / tty * - PullRequest
0 голосов
/ 04 июля 2019

У меня есть устройство с GPRS на борту. GPRS соединяется со сторонним приложением и работает. Мне нужно знать уровень сигнала соединения, поэтому я использую ATZ, затем AT + CSQ команды. Когда я работаю, используя некоторое программное обеспечение терминала, это работает. Затем я попытался использовать https://github.com/ishuah/bifrost soft в качестве терминала. Это работает также. Но как я могу просто связаться с устройством, не используя терминал, без повторного подключения или прерывания соединения и т. Д.?

Я пытался просто echo ATZ > /dev/ttyX - нет ответа

    // This writes, but reads only zeros (((

    package main

    import (
        "github.com/jacobsa/go-serial/serial"
        "io"
        "log"
        "time"
        "fmt"
    )

    func Sleep(duration int) {
        time.Sleep(time.Second * time.Duration(duration))
    }

    func printBuf(b []byte){
        for _, val:=range b {
            fmt.Printf("%x ", val)
        }
    }


    func main(){

    options := serial.OpenOptions{
            PortName:              "/dev/ttyX",
            BaudRate:              115200,
            DataBits:              8,
            StopBits:              1,
            MinimumReadSize:       0,
            InterCharacterTimeout: 50,
        }

    port, err := serial.Open(options)
        if err != nil {
            log.Printf("port.Read: %v", err)
            return
        }

        // Make sure to close it later.
        defer port.Close()

    var s string  = `AT+CSQ`
    b:=[]byte(s)

    n, err := port.Write(b)
        if err != nil {
            log.Printf("port.Write: %v", err)
        }

    log.Println("Written bytes: ", n)

    //Sleep(1)

    res := make([]byte, 64)
        n, err = port.Read(res)
        if err != nil && err != io.EOF {
            log.Printf("port.Read: %v", err)
        }

    log.Println("READ bytes: ", n)


    printBuf(res)


    }

/*
I expect (for example):
---------
ATZ
OK
AT+CSQ
+CSQ 22.4
*/

1 Ответ

1 голос
/ 04 июля 2019

Большинству последовательных устройств требуется символ завершения, чтобы реагировать на команды, которые они получают.

Если вы добавите его, ваш код должен работать:

var s string  = `AT+CSQ\r`

Я не вижу никаких других отличий от вашего кода и отправки команды через последовательный терминал. То же самое должно применяться, когда вы выводите команду непосредственно на дескриптор файла порта.

...