วิธีรับมากกว่าหนึ่งอินเตอร์เฟส uart


30

ตกลงฉันมีหนึ่งอินเทอร์เฟซ uart (TXD GPIO 14, RXD GPIO 15) ฉันต้องการอย่างน้อยหนึ่งอินเตอร์เฟส uart

การแก้ปัญหาที่เป็นไปได้:

  • การกัดบิต: ใช้ GPIO สำรองสองอันที่ไม่เกี่ยวข้อง ฉันเข้าใจว่าการกำหนดเวลาเป็นปัญหาสำหรับ linux มาตรฐาน มันจะน่าเชื่อถือด้วย baudrate ที่ต่ำมากหรือไม่

  • การสลับ: RPI ตัดสินใจว่าเมื่อใดควรพูดคุยกับอุปกรณ์ใด ใช้เช่นCD4066BC

  • spi to 2 x uart bridge: ไม่พบชิ้นส่วนที่เหมาะสม (ความพร้อมใช้งาน, ราคา, แพ็คเกจแบบขยาย)

  • usb to uart: แพง

มีตัวเลือกอื่น ๆ อีกไหม? ฉันอยากจะเปลี่ยนถ้าทำได้ คุณจะแนะนำอะไร


คำตอบ:


10

USB UART เช่น FTDI นั้นไม่แพงเลย ตัวเลือกอื่น ๆ ของคุณดูเหมือนจะทำให้คุณเสียเวลาและค่าใช้จ่ายมากกว่า ~ $ 13 ซึ่งอาจทำให้คุณเสียค่าใช้จ่ายและไม่น่าเชื่อถือหรือช้า เพียงเลือกตัวเลือกที่รวดเร็วและไร้ปัญหาเช่น:

http://www.dfrobot.com/index.php?route=product/product&product_id=147#.UOamLG-sh8E

Sparkfun ขายได้เช่นกัน อันที่จริงแล้วคุณอาจดึงอุปกรณ์ USB อันเก่าออกมาหรือซื้อจากร้านขยะที่ไม่รู้ว่ามันทำอะไร

ฉันยุ่งกับอะแดปเตอร์ SPI to UART สำหรับโครงการ Arduino ไม่มีห้องสมุดที่มีอยู่ดังนั้นฉันจึงเขียนของตัวเอง ในที่สุดมันก็ใช้ได้ แต่ถ้าฉันจะลดลงในส่วนที่ $ 15 ฉันจะมี ในความเป็นจริงให้เวลาฉันเสียค่าใช้จ่ายฉันควรจะมี mega กับพอร์ตอนุกรม 4

หรือหากคุณต้องการพอร์ตอนุกรมจำนวนมากคุณสามารถดูอนุกรม RS485 ซึ่งคล้ายกับ 232 (แม้ว่าจะไม่เข้ากัน) ซึ่งรองรับ multi-drop เช่นอินเทอร์เฟซหลายตัวในหนึ่งบรรทัด


1
นี่เป็นตัวเลือกที่ง่ายจากมุมมองของซอฟต์แวร์ FTDI มีไดรเวอร์ Linux รองรับอยู่นอกกรอบ ตัวเลือกอื่น ๆ ทั้งหมดจะต้องใช้ความพยายามอย่างยิ่งยวดในการทำงาน
เบอร์

cp2102 เป็นชิป usb uart ที่ฉันโปรดปราน การค้นหาอเมซอนอย่างรวดเร็วพบว่าพวกเขามีราคา $ 6.99 (แก้ไขจริง $ 1.50) พร้อมสายเคเบิล! ไม่สามารถเอาชนะได้!
portforwardpodcast

6

หากคุณตัดสินใจที่จะข้ามการเพิ่มฮาร์ดแวร์พิเศษและเพียงไปเส้นทางบิตการต่อสู้นี่ไม่ใช่เรื่องยากเหมือนภาพ

ก่อนอื่นเธรดการสื่อสารของคุณต้องไปตามเวลาจริง:

#include<sched.h>

struct sched_param param;               
param.sched_priority = sched_get_priority_max(SCHED_FIFO);
if( sched_setscheduler( 0, SCHED_FIFO, &param ) == -1 )
{
        perror("sched_setscheduler");
        return -1;
}

จากนี้ไปเธรดของคุณจะไม่ถูกล้างออกล่วงหน้าเป็นเวลา 950ms จากทุกวินาที*ยกเว้นว่ามันจะกลับมาควบคุมอย่างเต็มใจ (ผ่านsched_yield()หรือusleep()) ในเวลาที่เหมาะสมซึ่งจะไม่ทำให้มันถูก pre-empted มาก่อน ด้วย CPU 850MHz การวนซ้ำของบิตการแข่งขันจะไม่ได้ใช้งานเป็นส่วนใหญ่แม้จะใช้ความเร็วสูงสุดก็ตาม

ตอนนี้น่าเสียดายที่ความต้องการที่จะกลับมาควบคุมเป็นครั้งคราวหมายความว่าในขณะที่เธรดของคุณกำลังหลับอะไรก็ตามที่ "ฝ่ายตรงข้ามส่ง" ของคุณจะหายไปตลอดกาล แต่สำหรับจุดประสงค์นั้นคุณสามารถใช้การควบคุมการส่งสัญญาณได้ จัดสรร GPIO สำหรับ CTS บรรทัดที่คุณดึงลงก่อนที่จะให้ผลตอบแทนและสำรองตามการควบคุมการกู้คืน:

  bcm2835_gpio_write(CTS_PIN, LOW);
  usleep(10);
  bcm2835_gpio_write(CTS_PIN, HIGH);

หรือ (ควรใช้ IMHO มากกว่า) ใช้การควบคุมการส่ง XON / XOFF - ส่งอักขระ XOFF ไปที่ RS232 ก่อนนอน XON หลังจากคุณดำเนินการต่อ รหัส ASCII เริ่มต้นสำหรับสิ่งเหล่านี้'\x13'สำหรับ XOFF / "หยุดส่ง" และ'\x11'สำหรับ XON / "ส่งต่อ"

แน่นอนอุปกรณ์ระยะไกลของคุณจะต้องเชื่อฟังสิ่งเหล่านี้ หากไม่เป็นเช่นนั้นข้อมูลบางส่วนจะสูญหาย


4

ฉันพบสิ่งที่คุณกำลังมองหา: I2C / SPI slave ไปยังบริดจ์ UART / IrDA / GPIO

พวกเขามาในรุ่นเดียวและสอง (ดังนั้น 1 หรือ 2 พิเศษ UART) พวกเขา (NXP) ยัง (สำหรับด้านอื่น ๆ ในกรณีที่จำเป็น) มีต้นแบบ I2C / SPI ไปยังสะพาน UART / IrDA / GPIO

ข้อมูลเพิ่มเติมสามารถพบได้เกี่ยวกับชิปเหล่านี้ที่นี่และคู่หลัก

Maxim ยังมีชิปที่ทำสิ่งเดียวกัน


ข้อมูลดี แต่ลิงก์ NXP ให้ HTTP 403 ที่นี่
Tom

นี่คือแผ่นข้อมูลที่เกี่ยวข้อง: nxp.com/documents/data_sheet/SC16IS752_SC16IS762.pdf ?
Tom

3

สะพาน USB to UART นั้นราคาถูกและพร้อมใช้งาน แต่มีลักษณะจังหวะที่แย่มาก นวร์กขายบอร์ด "Embedded Pi" ซึ่งมีโปรเซสเซอร์ ARM STM32F ซึ่งคุณสามารถเขียนโค้ดโลหะเปลือยได้ ชิปตัวนั้นมี UART สามตัวและฉันคิดว่าพวกเขาสามารถไปได้เร็ว ถ้าคุณใช้เพื่อสื่อสารกับ Raspberry Pi ที่จะปล่อยให้ทั้งสองมีไว้เพื่อวัตถุประสงค์อื่น ข้อจำกัดความรับผิดชอบ: ฉันซื้อกระดานเหล่านี้มาแล้ว แต่มีเพียงแค่ใช้ Raspberry Pi เพื่อจัดการโดย I / O ที่ต้องการโดยตรง

หากคุณต้องการ UART ที่ช้าลงจำนวนมาก STM32F บนบอร์ดฝังตัว Pi อาจจัดการหมายเลขที่เป็นธรรมได้โดยเฉพาะอย่างยิ่งถ้าคุณยินดีที่จะเขียนภาษาแอสเซมบลีของ Arm หากมีสองกลุ่มของหมุด I / O 16 ตัวที่มีอยู่ในบอร์ดเดียวมันอาจเป็นไปได้ที่จะมีซอฟแวร์ UART พร้อมกัน 16 ตัวทั้งหมดทำงานพร้อมกันในอัตราการรับส่งข้อมูลที่ค่อนข้างดี (มีการขัดจังหวะเป็นระยะที่ 3x หรือ 5x ค่า latch แบบ 16 บิตจากพอร์ตรับไปยังบัฟเฟอร์และส่งออกค่าที่คำนวณล่วงหน้า 16 บิตจากบัฟเฟอร์ไปยังพอร์ตส่งหากคุณทำเช่นนี้ให้เวลาการให้บริการโดยเฉลี่ยสำหรับซอฟต์แวร์ UART ไม่มากเกินไป จะไม่สำคัญว่าจะเกิดกรณีที่เลวร้ายที่สุดเป็นครั้งคราว (เช่นพอร์ตสิบหกพอร์ตที่ได้รับพร้อมกัน)

วิธีการนี้สามารถทำงานได้อย่างมีประสิทธิภาพอย่างน่าทึ่งสำหรับการรับเนื่องจากรหัส "กรณีทั่วไป" ไม่จำเป็นต้องดู UART เดี่ยว ๆ สมมติว่าคุณกำลังสุ่มข้อมูลที่ 5x และ 47 ไบต์สุดท้ายของบัฟเฟอร์จะถูกทำซ้ำก่อนหน้าทันที สมมติว่าข้อมูลถูกเขียนลงในบัฟเฟอร์ตามลำดับจากน้อยไปมากคุณสามารถตรวจสอบว่ามีการรับไบต์ใด ๆ บน 16 แชนเนลทั้งหมดโดยเพียงแค่พูดว่า:

bytes_ready = (armed_flag & data[rxptr] & ~data[rxptr-47] & ~data[rxptr-46] & ~data[rxptr-45] & ~data[rx_ptr-44]);

ถ้าbytes_readyเป็นศูนย์จะไม่ได้รับข้อมูลใด ๆ มิฉะนั้นถ้าเช่นบิต 2 ของbytes_readyถูกตั้งค่านั่นหมายความว่าไบต์ข้อมูลที่ได้รับอาจพบในบิต 2 ของข้อมูล [rx_ptr-40], ข้อมูล [rx_ptr-35], ข้อมูล [rx_ptr-30] ฯลฯ เมื่อคว้าหนึ่งครั้ง ข้อมูล, ล้างบิตที่ 2 ของอาวุธ _flag และจัดการเพื่อให้ได้รับการตั้งค่าใหม่หลังจากประมาณ 44 ตัวอย่าง

วิธีการนี้จะต้องใช้การทำงานกับตัวอย่างเหล่านั้นที่ได้รับข้อมูลครบจำนวนไบต์ (และอาจเป็นจำนวนมากหาก 16 สถานีทั้งหมดมีข้อมูลจำนวนไบต์มาถึงพร้อมกัน) แต่ในตัวอย่างส่วนใหญ่ปริมาณงานจะมาก เล็กน้อย. หากมีหมุด I / O 64 ตัวสามารถจัดการ UART ได้สูงสุด 32 UART โดยใช้วิธีนี้โดยไม่ต้องเพิ่มงานพิเศษใด ๆ ลงในเคส "ทั่วไป"


1

ไมโครคอนโทรลเลอร์เช่น Picaxe สามารถใช้ข้อมูลอนุกรมในหนึ่งพินและส่งออกข้อมูลอนุกรมในพินที่เหมาะสม สิ่งนี้จะช่วยให้คุณได้ผลลัพธ์ที่เป็นอนุกรมมากขึ้นถ้าคุณพร้อมที่จะบอก Picaxe ว่าควรใช้ขาไหน มันสามารถทำสิ่งเดียวกันได้ แต่กลับกันดังนั้นจึงสามารถรับข้อมูลอนุกรมจากอุปกรณ์หลายเครื่องและส่งไปยัง Raspberry Pi อีกตัวเลือกหนึ่งอาจจะทำให้อุปกรณ์ที่เชื่อมต่อต้องมีการคัดเลือก ซึ่งหมายความว่าอุปกรณ์ 1 จะต้องได้รับข้อมูล 'd1' ก่อนที่จะรับฟังข้อมูลเพิ่มเติมในสายอนุกรม อุปกรณ์ 2 อาจมี 'd2' เป็นตัวระบุ นี่หมายความว่าการพูดคำว่า 'สวัสดี' ให้กับอุปกรณ์ 1 คุณเพียงแค่ส่ง 'd1hello' บนบรรทัด UART

Picaxes มีราคาค่อนข้างถูกคุณสามารถหาซื้อได้ที่http://www.techsupplies.co.uk/และมีหลายขนาดด้วยจำนวนพินและอื่น ๆ


1

หากการสื่อสารไปยังอุปกรณ์ทาส UART หลายรายการไม่จำเป็นต้องเกิดขึ้นพร้อมกันคุณสามารถแชร์พอร์ต UART ที่มีอยู่หนึ่งพอร์ตระหว่างอุปกรณ์เหล่านั้น คุณสามารถใช้ทรานซิสเตอร์เพื่อเปิดใช้งานเฉพาะการเชื่อมต่อ RxD / TxD ไปยังอุปกรณ์ที่คุณต้องการคุยด้วย ทรานซิสเตอร์เหล่านี้สามารถควบคุมได้ด้วยพิน Raspberry Pi GPIO อื่น ๆ


1

Raspberry Pi 4 รองรับอินเตอร์เฟส UART มากถึง 4 ตัวในขณะนี้ที่จำเป็นต้องเปิดใช้งานด้วยการซ้อนทับทรีอุปกรณ์ คุณสามารถค้นหาวิธีการทำสิ่งนี้และพินที่ใช้ที่นี่ในตอนนี้:

https://www.raspberrypi.org/forums/viewtopic.php?t=244827

มูลนิธิ RPi ยังคงเตรียมเอกสารสำหรับการนี้


0

ผมมีปัญหาเหมือนกัน. ฉันต้องการเชื่อมต่อกับโมดูล GSM 2-4 ตัวและฉันพบวิธีแก้ไขปัญหาฮาร์ดแวร์: http://www.instructables.com/id/SPI-to-4-x-UART-Bridge-MULTIUART/

วิธีนี้เป็นพื้นฐานของ PIC24FJ64GA306 คุณสามารถแทนที่ PIC ด้วย Atmel mcu แต่คุณต้องสร้าง PCB ใหม่ :)


0

ฉันใช้ SC16IS752 IC ซึ่งเป็นตัวแปลง SPI เป็น 2xUART มันทำงานได้ดีกับ Raspbian Stretch

มันแพงกว่าชิพ FTDI นิดหน่อย แต่มี uarts สองอันและฉันไม่ต้องใช้พอร์ต USB อันมีค่า


-1

ดูhttps://www.kickstarter.com/projects/1915118535/uart-hat-for-raspberry-piฉันหวังว่ามันจะช่วยแก้ปัญหาของคุณได้


1
เนื่องจากนี่ไม่ใช่ผลิตภัณฑ์ที่มีอยู่จริงจึงเป็นตัวเลือกที่ไม่ดี
Jacobm001

1
แย่กว่านั้นดูเหมือนว่า บริษัท ที่ทำโครงการแคนซัสโดยไม่ส่งมอบสินค้า
WineSoaked
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.