Tôi có thể làm gì để giảm độ trễ từ các cổng nối tiếp được gắn vào PC thông qua bộ chuyển đổi Nối tiếp sang USB?


8

Tôi nghĩ rằng tôi đã vô tình phát hiện ra một nhu cầu trong cuộc sống của tôi cho các hệ thống nhúng. Thật là tuyệt! Và loại đáng sợ. Và tôi cần sự giúp đỡ.

Bối cảnh : Tôi đã được thuê để xây dựng một ứng dụng GUI có chức năng quét từ hai SICK LMS-291 và tích hợp chúng với GPS chính xác dưới một inch, để bạn biết nơi mỗi lần quét xảy ra. Là một lập trình viên ngây thơ, tôi hiểu rằng thời gian sẽ rất quan trọng, nhưng không nhận ra điều đó cũng khó! Nếu bạn không biết khi nào từng điểm GPS và mỗi lần quét xảy ra, bạn không thể tìm ra nơi quét xảy ra. Giáo sư.

Họ đã chỉ định windows 7 làm nền tảng, cũng như mua hộp SeaLevel RS422 sang USB để kết nối các cảm biến và GPS, và trong một thời gian ngắn, tôi phát hiện ra sự điên rồ của mình. Ở đâu đó giữa các cảm biến và chương trình máy tính của tôi, một cái gì đó đã giữ cho các bản quét không đến kịp thời. LMS phun ra 75 lần quét mỗi giây, hoặc ở mức 13,32 ms / lần quét. Chương trình của tôi không nhận được chúng một cách kịp thời. Nó nhận được chúng cứ sau 100 mili giây, trong các nhóm 7 hoặc 8 hoặc 10 hoặc một cái gì đó. Ngoài ra, đôi khi không đủ quét, hoặc chúng bị hỏng. Bộ điều hợp SeaPort này chỉ gửi mười lần một giây (có thể không? Tôi không biết USB hoạt động như thế nào) hoặc Windows không kiểm tra bộ đệm (phải có bộ đệm ở đâu đó, phải không?) Gần như thường xuyên.

Ngày nay : Điều này dẫn đến một số điểm không chính xác mà khách hàng về cơ bản là ổn. Mặc dù vậy, tôi không, và vì tôi đã có cơ hội thực hiện công việc tương tự cho khách hàng (tích hợp thêm đầu vào cảm biến!), Tôi muốn tìm ra cách làm đúng, ví dụ như độ chính xác của GPS , có thể đảm bảo về độ chính xác và độ chính xác của các vị trí quét.

Điều đó giống như thế nào? Tôi cần một giao diện người dùng và để có thể kiểm tra đầu vào từ ba thiết bị này cứ sau 13,32 mili giây. Nếu tôi đã sử dụng FreeRTOS với, giả sử, Nano-X cho GUI, chạy trên máy tính xách tay mà họ cung cấp, liệu điều đó có giống như một giải pháp lành mạnh không? Có thể bộ chuyển đổi RS-422 sang USB đang gây ra những chậm trễ này và việc sử dụng Windows thực sự tốt cho mục đích này?


2
Bạn đã giết ai để có được những người tìm thấy tia laser đó, và anh ta có một người bạn cũng có thể có một số người không?
Sói Connor

@ConnorWolf Hah! Tôi ước tôi sở hữu chúng. Đó là cho ag (xác định khối lượng cây trồng), vì vậy họ sẵn sàng bỏ ra phần cứng (máy kéo có thể có giá 75 nghìn đô la ...), nhưng không sẵn sàng bỏ ra cho tài năng lập trình.
canisrufus

Tôi không biết kích thước bộ đệm trong Windows, nhưng bạn chắc chắn muốn kiểm tra điều đó. Trên Linux, các bộ đệm này có kích thước 4kB và tùy thuộc vào dữ liệu bạn đang gửi và hệ thống gọi bạn sử dụng, một chương trình chỉ có thể nhận được các khối dữ liệu 4kB. Nếu đó là vấn đề bạn muốn kiểm tra cẩn thận những cuộc gọi hệ thống nào bạn sử dụng để đọc từ bộ đệm.
jippie

1
Tôi khuyên bạn nên xem xét kết nối nối tiếp trực tiếp - bạn có thể nhận thẻ cổng nối tiếp cho PC và máy tính xách tay (cũng lưu ý rằng hầu hết các sách cứng của Panasonic vẫn có cổng nối tiếp là tiêu chuẩn). Điều này sẽ thoát khỏi mọi vấn đề về bộ đệm trong giao diện nối tiếp USB. Windows 7 có khả năng thời gian thực đủ tốt, do đó bạn có thể không cần phải rời khỏi đó.
Mối quan

Chỉ cần một nhận xét: tiêu đề là buồn cười, nhưng không giúp được nhiều để tìm ra nội dung của câu hỏi: bạn có thể làm rõ nó không?
clabacchio

Câu trả lời:


6

Vấn đề gần như chắc chắn là ở bộ đệm USB liên quan đến bộ chuyển đổi USB-RS422. USB có độ trễ thay đổi và khá cao.

Giải pháp đơn giản nhất sẽ là giao diện RS422 tốt hơn, lý tưởng nhất là dựa trên PCI / PCI-e. Điều đó sẽ giải quyết các vấn đề về độ trễ.

Bạn cũng có thể sửa đổi tỷ lệ bỏ phiếu USB, mặc dù điều này phụ thuộc khá nhiều vào HĐH máy chủ (bạn đang sử dụng nền tảng nào?).


Đối với những gì nó có giá trị, tôi đã tìm kiếm trên trang web của hệ thống sealevel, và đó là MASSIVELY bị nhiễm nhảm nhí tiếp thị. Họ thực sự dành 10 trang và nhiều trang trắng để nói rằng "chúng tôi sử dụng một trung tâm USB bên trong, thay vì thực hiện ghép kênh MCU".

Này SeaLevel! Đó là những gì mà giao diện USB-serial 4 cổng giá rẻ 50 đô-la mà tôi đã mua trên e-bay từ Trung Quốc cũng vậy! Bạn không đặc biệt, ngay cả khi bạn viết một nửa tá giấy trắng thô sơ đang cố gắng làm cho nó nghe giống như bạn!

Bạn đã cố ép những thứ đó sử dụng trình điều khiển FTDI chưa? Tôi đã bỏ tiền vào nó, họ chỉ đang sử dụng FTDI FT 232 tiêu chuẩn hoặc tương tự. Bạn có thể mở hộp trên một trong số chúng mở và chụp ảnh không?


Nếu bạn thực sự muốn quay phần cứng của riêng bạn, cho các cơ hội vui chơi hoặc giáo dục, tôi thực sự khuyên bạn không nên cố gắng làm mọi thứ trong phần cứng. Vì bạn chỉ cần tương quan thời gian với cả ba tín hiệu, tất cả những gì bạn thực sự cần là thứ có thể nghe trên ba dòng nối tiếp (hai RS422, một RS232 (GPS)), đóng dấu thời gian dữ liệu và chuyển tiếp nó đến máy tính chính .

Khi dữ liệu được đóng dấu thời gian, bạn có thể có tất cả độ trễ của bộ đệm mà bạn muốn, vì bạn luôn có thể chỉ nhìn vào dấu thời gian.

Trên thực tế, nếu bạn không có cơ sở về phần cứng, việc thiết kế một cái gì đó đủ độ giòn để vẽ một GUI đẹp là công việc khá khó khăn.

Cá nhân, tôi có thể ném một MCU ARM khá táo bạo vào vấn đề đệm, và được thực hiện với nó. Mặc dù thực tế đó là Arduino, Arduino Do có rất nhiều SRAM, và đủ nhanh hơn cho những gì bạn cần (và có rất nhiều hỗ trợ, luôn luôn tốt).
Ngoài ra, sê-ri STM32 có hiệu suất tương tự và dành cho người dùng "nâng cao" hơn (đọc, có ít hơn hoặc không có ví dụ để tham khảo). ST làm cho rất nhiều bảng eval khá đẹp, cực kỳ rẻ tiền là tốt.

Với Hạn, bạn có được một cổng USB gốc, mà bạn có thể cuộn trình điều khiển CDC của riêng mình nếu muốn. Một số bảng STM32 cũng có USB gốc.


Về hệ điều hành: Hiện tại tôi đang sử dụng windows 7 trên một máy tính bảng lõi đơn. Tôi cũng có thể sử dụng máy tính xách tay và cài đặt bất cứ thứ gì tôi muốn.
canisrufus

7
Dành một bộ vi điều khiển để tương quan dữ liệu, sau đó chuyển tiếp nó vào hộp cửa sổ cho mục đích hiển thị là cách tôi cũng sẽ đi. +1
JustJeff

1
Thẻ bạn liên kết có thể sẽ hoạt động, mặc dù từ mức độ nhảm nhí của SeaLevel dường như ở nơi khác, tôi không chắc là mình tin tưởng chúng. Đối với những gì đáng giá, họ đề cập rằng thẻ PCI-e sử dụng 16C954IC tứ giác phần cứng (có lẽ có hai trong số chúng trên thẻ).
Sói Connor

1
Thực sự, tôi nghĩ rằng giải pháp thích hợp duy nhất là gọi cho họ và chỉ hỏi về vấn đề độ trễ. Có thể có những điều có thể được điều chỉnh trong trình điều khiển của họ!
Sói Connor

2
+1 trên giải pháp STM32F4; bo mạch STM32F4-Discovery được định giá thấp về mặt hài hước , có tới 6 UART và cổng USB OTG FS. Nếu bạn không quen thuộc với thiết kế nhúng thì bạn sẽ thấy khá khó khăn khi chạy USB trên nó; đơn giản nhất là chỉ cần nối qua UART bằng cáp FTDI. IDE Coocox miễn phí, không có giới hạn kích thước mã và hỗ trợ bảng Discovery một cách hợp lý.
Markt

3

Nếu tôi hiểu câu hỏi, điều này xuất hiện là lấy thông điệp thời gian / địa điểm từ GPS qua một dòng nối tiếp và các thông điệp dữ liệu phạm vi tương quan nhận được trên các dòng nối tiếp khác. Lý tưởng nhất là các tin nhắn tìm phạm vi sẽ có dấu thời gian riêng và nếu bạn có thể đồng bộ hóa tất cả các đồng hồ, bạn có thể xác định vị trí phạm vi được thực hiện bằng cách nội suy dấu thời gian giữa hai tin nhắn gps với tem thời gian phù hợp nhất. Nhưng tất nhiên, bạn không có điều đó.

Một vài giải pháp xuất hiện trong tất cả các dòng sử dụng vi điều khiển để thực hiện tương quan dữ liệu thời gian thực và bơm đầu ra của nó vào PPC cho mục đích hiển thị. Về cơ bản vi điều khiển là có để đối phó với các vấn đề thời gian chặt chẽ.

Vì vậy, đối với một giải pháp đơn giản hơn, tất cả những gì bạn cần là một cách nào đó để thu thập tất cả các tin nhắn từ một số dòng nối tiếp khác nhau và kết hợp chúng thành một luồng duy nhất, theo thứ tự chúng được nhận và bơm chúng vào PC. Bạn có thể suy ra rằng bất kỳ tin nhắn tìm phạm vi nào giữa hai tin nhắn GPS xảy ra đôi khi giữa hai tin nhắn đó.

Điều này cung cấp cho bạn một mức độ không chắc chắn, tất nhiên phụ thuộc vào tần số của tin nhắn GPS. Sự đánh đổi là khi bạn tăng tần số tin nhắn GPS (để có được mối tương quan chính xác hơn), bạn sẽ tăng các yêu cầu đối với vi điều khiển và các yêu cầu đối với liên kết nối tiếp vào PC. Ở một thái cực, liên kết nối tiếp được bão hòa với các tin nhắn GPS với một thông điệp phạm vi không thường xuyên được gửi đến. Rõ ràng là hầu hết các tin nhắn GPS đó là không cần thiết. Tuy nhiên, ưu điểm của giải pháp này là micro có rất ít việc phải làm, từ quan điểm phần mềm. Bạn có thể làm tất cả trong một vòng lặp đơn giản của ngôn ngữ lắp ráp, không cần hệ điều hành.

Đối với một giải pháp phức tạp hơn, bạn có thể tạo đồng hồ cục bộ trong micro và sử dụng GPS để đồng bộ hóa đồng hồ đó , để khi bạn nhận được thông báo phạm vi, bạn có thể lấy dấu thời gian bằng đồng hồ của micro. Sử dụng một vi mô với cơ sở thời gian tinh thể, bạn có thể nhận được bằng các tin nhắn GPS 1Hz và vẫn tốt hơn nhiều so với thời gian chính xác đến mili giây được đóng dấu trên các tin nhắn phạm vi. Một người có hệ thống nhúng có khả năng cũng có thể rút cái này ra trong trình biên dịch chương trình trên một micro cấp thấp hơn, nhưng bạn đã đề cập rằng bạn chỉ mới bắt đầu. Bạn có thể nhìn vào một micro mạnh hơn có thể chạy linux và có thể tìm thấy một giải pháp có sẵn để đồng bộ hóa đồng hồ linux với GPS.


Dễ dàng hơn việc xây dựng đồng hồ thời gian thực trong MCU và đồng bộ hóa nó bằng GPS chỉ là sử dụng bất kỳ thiết bị ngoại vi hẹn giờ / bộ đếm nào để đo số chu kỳ giữa tin nhắn GPS và tin nhắn tìm phạm vi, và thêm thông tin theo thời gian delta đó vào luồng dữ liệu.
Ben Voigt

3

Những gì tôi có thể làm là ghép dữ liệu nối tiếp vào một luồng dữ liệu nối tiếp mới ở tốc độ higer, với một xen kẽ tĩnh. Sau đó nạp dữ liệu thông qua USB-UART vào máy tính. Bằng cách đó, bạn sẽ biết rằng byte đầu tiên là từ thiết bị 1, byte thứ hai từ thiết bị 2, byte thứ ba từ thiết bị 3 và trong trường hợp này là byte thứ tư là CRC hoặc số thứ tự. Ném vào một vài byte bắt đầu của điểm đánh dấu khung để đồng bộ hóa trên luồng dữ liệu, đệm byte nếu không có dữ liệu và bạn đã hoàn tất. Bạn có thể không biết thời gian tuyệt đối, nhưng bạn có biết rằng thời gian tương đối giữa các khối dữ liệu khác nhau.


1

Tôi cũng sẽ đi với một vi điều khiển để nhận dữ liệu RS, đánh dấu thời gian và chuyển tiếp nó tới PC. Bạn không thể thực hiện bất kỳ công việc quan trọng nào về thời gian I / O với PC Windows (ngoại trừ với card âm thanh), bởi vì phần mềm và trình điều khiển luôn thay đổi khi trình điều khiển được cập nhật sau lưng bạn.

Nhưng điều đầu tiên tôi sẽ làm là có được một bộ phân tích logic USB, bạn có thể mua một cái với giá dưới 100 USD, lấy một số tin nhắn từ máy thu GPS và kiểm tra chính xác khi mỗi byte được nhận. Sử dụng thông tin đó để thử / tính toán chính xác thời gian của dữ liệu ở vị trí đầu tiên: ví dụ chính xác những gì và khi hộp GPS truyền. Sau đó, bạn có thể tìm ra mức độ chính xác nào có thể đạt được, và bạn sẽ sẵn sàng bỏ ra bao nhiêu nỗ lực để đạt được một mức độ chính xác nhất định.

nhập mô tả hình ảnh ở đây

Ở trên, một hình ảnh của một số phân tích logic USB (Saleae?).


[Chỉnh sửa] Haha, sử dụng card âm thanh có thể là một cách thú vị để làm cho nó thực sự hoạt động; bạn có thể kết nối dữ liệu UART với đầu vào card âm thanh (thông qua một số điện trở và tụ điện) và viết phần mềm để phát hiện từng cạnh trong luồng nối tiếp, mang lại cho bạn độ chính xác về thời gian tuyệt vời!. Ok, tôi không thực sự đề nghị điều này một cách nghiêm túc, chỉ vì một số tiếng cười!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.