Bagaimana cara mengirim dan menerima data menggunakan Pyserial?

Saya ingin mengirim dan menerima data antara dua port serial. Saya menggunakan toolkit CANtact sebagai perangkat serial saya. Saya menggunakan kode berikut

tulis.py:

import serial
#init serial port and bound
# bound rate on two ports must be the same
ser = serial.Serial('/dev/ttyACM1', 9600)
print(ser.portstr)

#send data via serial port
serialcmd=("012345688902341")
ser.write(serialcmd.encode())
ser.close()

mendengarkan.py

import serial
serBarCode = serial.Serial('/dev/ttyACM0', 9600, timeout=1)

while True:

    #read data from serial port
    serBarCode = serBarCode.readline()

    #if there is smth do smth
    if len(serBarCode) >= 1:
        print(dataBarCode.decode("utf-8"))

Saya mendapatkan kesalahan berikut:

hp@HP-Notebook:~$ cd /home/hp/Desktop

hp@HP-Notebook:~/Desktop$ python3 tulis.py

/dev/ttyACM1

hp@HP-Notebook:~/Desktop$ python3 mendengarkan.py

Traceback (panggilan terakhir terakhir):

File "listen.py", baris 7, masuk

serBarCode = serBarCode.readline()

AttributeError: objek 'bytes' tidak memiliki atribut 'readline'

hp@HP-Notebook:~/Desktop$


person annonymous    schedule 06.03.2019    source sumber


Jawaban (2)


serBarCode = serBarCode.readline()

Anda menimpa objek serial Anda serBarCode dengan data yang Anda baca darinya. Jadi loop berjalan dengan baik pertama kali, tetapi pada iterasi berikutnya, objek serial Anda telah diganti dengan byte yang Anda baca sebelumnya

Lakukan ini sebagai gantinya:

data = serBarCode.readline()
if len(data) >= 1:
    print(dataBarCode.decode("utf-8"))
person entropy    schedule 06.03.2019
comment
Kesalahan telah teratasi tetapi saya tetap tidak dapat mencetak hasilnya - person annonymous; 06.03.2019
comment
Anda meneruskan /dev/ttyACM2 ke write.py Anda tetapi sebenarnya menulis ke /dev/ttyACM1. Dan listening.py Anda membaca dari /dev/ttyACM0. Apa yang Anda tulis ke ACM1 tidak akan tersedia di ACM0 kecuali ada proses lain dalam sistem yang membaca dari ACM1 dan menulis ke ACM0 - person entropy; 06.03.2019
comment
Apakah perangkat yang saya gunakan untuk komunikasi serial penting? Saya menggunakan CANtact yang umumnya mengirimkan pesan CAN, juga haruskah saya membuat soket di antara kedua perangkat? - person annonymous; 06.03.2019
comment
Apakah listen.py dan write.py seharusnya dijalankan di mesin yang sama? - person entropy; 06.03.2019
comment
@annonymous Penting jika ada protokol khusus yang diperlukan untuk berkomunikasi antar unit. Jika tidak, data Anda mungkin akan hilang. - person John Szakmeister; 06.03.2019
comment
Jika Anda mencurigai perangkat serial Anda mengirimkan data melalui port serial tetapi skrip Anda tidak membacanya, Anda dapat mencoba mengirim dan menerima data secara manual dari port tersebut. Coba echo "012345688902341" > /dev/ttyACM1 lalu lakukan cat /dev/ttyACM0 - person entropy; 06.03.2019
comment
Saya mendapatkan kesalahan berikut ketika saya mencoba echo dan cat bash: echo: write error: Input/output error dan cat: /dev/ttyACM0: Input/output error - person annonymous; 06.03.2019
comment
@suicideteddy write.py dan listening.py dijalankan di dua perangkat berbeda - person annonymous; 06.03.2019

Anda menulis bahwa Anda menggunakan perangkat CANtact.

Perangkat ini tidak mengerti "012345688902341".

Perangkat berbicara dengan protokol tertentu. Misalnya. untuk mengirim pesan CAN, perintahnya dimulai dengan t diikuti dengan CAN-ID, diikuti oleh DLC, diikuti oleh data dan seterusnya.

Perintah lain dimulai dengan F, K, dll.

Pesan Anda kemungkinan besar diabaikan begitu saja oleh perangkat CANtact.

Anda pasti harus menggunakan perpustakaan tingkat yang lebih tinggi seperti pyvit untuk menggunakan perangkat.

person M. Spiller    schedule 06.03.2019
comment
akankah pyvit dapat menerima pesan seperti 012345688902341? - person annonymous; 06.03.2019
comment
Ya, pyvit bisa digunakan untuk mengirim data. Ini akan menangani komunikasi dengan perangkat CANtact dan mengucapkan protokol serial sehingga perangkat mengetahui apa yang harus dilakukan. Pesan Anda lebih besar dari 8 byte, jadi kemungkinan besar Anda ingin menggunakan ISO-TP untuk mentransfer data Anda. - person M. Spiller; 06.03.2019
comment
Saya menggunakan data ini 012345688902341 untuk tujuan pengujian tetapi sebenarnya saya ingin mengirim serangkaian data seperti ini 7f33117cf266a525a029a59541b3e80f3f yang tidak lain hanyalah pesan CAN yang di-hash. Saya mencoba ISO-TP untuk mengirim pesan ini tetapi di sisi penerima, saya menerima pesan dalam potongan-potongan. Pesan-pesan yang terfragmentasi ini tidak sesuai urutan pengirimannya dan saya tidak dapat menyusunnya kembali. Itulah alasan mengapa saya beralih ke komunikasi serial. Saya ingin pesan yang dikirim di sisi pengirim diterima seperti itu di sisi penerima. Apakah ada metode yang tersedia untuk itu? - person annonymous; 06.03.2019
comment
Dalam hal ini Anda berbicara dengan perangkat serial, yang tidak ada hubungannya dengan komunikasi serial melalui CAN. ISO-TP adalah cara untuk pergi ke sini. Tentu saja pihak penerima juga harus membicarakan ISO-TP. Menerima fragmen yang tidak berurutan (dalam jaringan CAN yang terdiri dari dua node) hanya dapat dilakukan jika fragmen tersebut dikirim tidak berurutan. - person M. Spiller; 06.03.2019
comment
Apakah CANtact hanya menerima pesan CAN, bukan format lain seperti string, data, file teks? - person annonymous; 06.03.2019
comment
CANtact adalah perangkat keras untuk mengirim dan menerima data pada bus CAN. Jadi hanya bisa mengirim dan menerima pesan CAN. Tapi tentu saja Anda bisa menggabungkan string, data, file, dll ke dalam pesan CAN dan mengirim serta menerimanya. - person M. Spiller; 06.03.2019
comment
Terima kasih untuk informasinya. Bisakah Anda menyarankan situs web, proyek, Repositori Git untuk referensi karena saya baru mengenal domain ini - person annonymous; 06.03.2019
comment
Baru sadar bahwa ini bukan satu-satunya pertanyaan Anda yang telah saya jawab. Pyvit memang memiliki dukungan untuk ISO-TP. Untuk informasi umum tentang ISO-TP lihat saja di Wikipedia. Protokolnya dijelaskan di sana. Secara umum, mungkin ada baiknya untuk membaca tentang model OSI dan memahami lapisan-lapisan yang berbeda. - person M. Spiller; 06.03.2019
comment
Mari kita melanjutkan diskusi ini dalam chat. - person annonymous; 06.03.2019