ฉันจะรับข้อมูลจากพอร์ตอนุกรมได้อย่างไร


12

ฉันมีโมดูลวิทยุ Ciseco XRFและบอร์ดขยายของ Slice of Pi

การใช้โปรแกรม 'หน้าจอ' ทำงานได้ดี; ฉันสามารถดูข้อมูลที่ถูกส่งไปยังโมดูล XRF

ฉันจะรับข้อมูลจากพอร์ตอนุกรมได้อย่างไรเพื่อให้สามารถประมวลผลได้ ฉันลอง Perl แต่ไม่ได้อ่านอะไรเลย


2
สวัสดีเจอราร์ดยินดีต้อนรับสู่ราสเบอร์รี่ Pi.SE คุณช่วยตรวจสอบว่าฉันได้เพิ่มลิงค์ที่ถูกต้องได้หรือไม่?
Alex Chamberlain

ใช่. เพียงแค่งาน
user518

คุณมีรหัสใด ๆ อยู่แล้ว? ปัญหาเฉพาะคืออะไร คุณไม่สามารถอ่านข้อมูลจากซีเรียลเลยหรือในหลาม?
Piotr Kula

@ppumkin เขาต้องการทราบวิธีรับข้อมูลจากพอร์ตอนุกรม

คำตอบ:


5

ฉันไม่ได้ลองสิ่งนี้ใน Pi แต่ฉันใช้ python เพื่อเข้าถึงพอร์ตอนุกรมบน Beagle Bone สามารถติดตั้ง Python แบบอนุกรมได้sudo apt-get install python-serial

จากนั้นคุณสามารถใช้ข้อมูลโค้ดต่อไปนี้:

import serial
serialport = serial.Serial("/dev/ttyS0", 9600, timeout=0.5)
serialport.write("What you want to send")
response = serialport.readlines(None)
print response

เห็นได้ชัดว่าแทนที่ "/ dev / ttyS0" ด้วยชื่อของพอร์ตอนุกรมและ 9600 ด้วยอัตรารับส่งข้อมูลที่คุณต้องการ การตอบสนองจะเป็นอาร์เรย์ที่มีบรรทัดที่ส่งคืนโดยพอร์ตอนุกรม

รายละเอียดเพิ่มเติมของ python API สามารถดูได้ที่http://pyserial.sourceforge.net/


3

ชื่อของพอร์ตอนุกรมบน pi คือ: ttyAMA0(*)

ดังนั้นรหัสของฉันคือ:

import serial
serialport = serial.Serial("/dev/ttyAMA0", 9600, timeout=0.5)
serialport.write("My string output to serial port")
response = serialport.readlines(None)
print response 

(*) ตรวจสอบเอาต์พุตของdmesgเพื่อค้นหาชื่ออุปกรณ์เมื่อต่อกับ pi อาจเป็นได้ttyUSB0ถ้าคุณต่อ USB เข้ากับตัวแปลงอนุกรม


4
คุณหมายถึงสิ่งนี้เพื่อแสดงความคิดเห็นในโพสต์ของ Phil หรือไม่? ฉันสามารถแปลงมันถ้าเป็นเช่นนั้น
ramblinjan

0

ตัวอย่างการใช้กับ C # และเรียกใช้ด้วย Mono

private _serialPort = null;

privatevoid Form1_Load(object sender, EventArgs e)
{
  _serialPort = new SerialPort(“COM1″, 9600, Parity.None, 8);
  _serialPort.DataReceived += new        
  SerialDataReceivedEventHandler(_serialPort_DataReceived);
  _serialPort.Open();
}

void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
  string data = _serialPort.ReadExisting();
  // do something with your data, you will need to invoke a delegate to update the UI
}

นี่เป็นรหัสที่ง่ายมากในการรับข้อมูล

http://susheelonline.com/communication-with-serial-post/


ฉันเพิ่มว่านี่สำหรับ C # เท่านั้น ไม่ทุบตี C / C ++ รหัสตรงไปตรงมาคลุมเครือมากและใช้วิธีการเข้ารหัสที่ไม่ดี ... แต่มันก็ใช้ได้ดี ยังไม่ได้รับ +1 เนื่องจากเป็นแบบฟอร์มชนะและไม่ใช่คอนโซล
Piotr Kula

0

ใน Pi บางพอร์ตอนุกรมคือ / dev / ttyS0 ส่วนอื่น ๆ ก็คือ / dev / ttyAMA0 หากคุณใช้อะแดปเตอร์ USB มันจะกลายเป็น / dev / ttyUSB0 นี่ไม่ใช่รายการที่ครบถ้วน

ที่พรอมต์ BaSH คุณสามารถพิมพ์

echo -en "my text\n" > /dev/ttys0  ## write to serial
cat /dev/ttyS0                     ## read from serial

ใน C คุณสามารถ

#include <stdio.h>
char  reply[32];                                // response storage
FILE*  fd = fopen("/dev/ttyS0", "rb");          // open Serial
fprintf(fd, "request\n");                       // write serial
fread(reply, sizeof(char), sizeof(reply), fd);  // read serial
printf("response: %s\n", reply);                // display result
fclose(fd);                                     // close serial
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.