PICDEM-Board und Linux-Verbindung über Seriell

TL; DR : Ich kann im Terminal öffnen screenoder puttyeine Sitzung mit dem durchführen /dev/ttyUSB0, aber übertragene Zeichen sind unsichtbar. Was könnte das mögliche Problem sein?

Ich habe ein PICDEM-Board mit PIC18F87J11- und PIC18F8722-Mikrocontrollern und verbinde das Board über ein serielles USB-Kabel mit meinem Ubuntu-Linux-Laptop. Der Code im Mikrocontroller soll jedes auf der Tastatur eingegebene Zeichen zurück an die Konsole übertragen. Dies funktioniert gut mit Windows 7-Computern und Putty. Bei Ubuntu - es wird eine Verbindung in Bildschirm oder Putty hergestellt, aber die Ausgabe ist unsichtbar - nur der Cursor bewegt sich bei jedem Tastendruck kontinuierlich (dasselbe Verhalten bei Windows 7).

Tun hexdumpzeigt Folgendes:

skolodya@ubuntu:$ sudo hexdump -c /dev/ttyUSB0                                 
[sudo] password for xieerqi: 
0000000  \b  \b  \b  \b  \b  \b  \b  \b  \b  \b  \b  \b  \b  \b  \b  \b
*
0001900  \b  \b  \b  \b  \b  \b  \b  \b  \b  \b  \b  \b  \b  \b  \n  \n
0001910  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n

cat /dev/ttyUSB0zeigt, dass Zeichen vorhanden sind, außer dass sie in der Caret-Notation auftauchen, ^H, ^E, so.

Der Code auf dem Mikrocontroller selbst zeigt keine Hinweise auf Probleme. Das char-Array rxBuffer erhält seine Zeichen von RCREG1so rxBuffer[rxCount] = RCREG1.

Zusätzliche Informationen (wie gewünscht) :

Derzeit spuckt der Code "HelloWorld string" ( TXREG1 = txStr[txCount]) aus.

Ausgabe vonhexdump -C /dev/tty | head -n 10

skolodya@ubuntu:$ hexdump -C /dev/ttyUSB0 | head -n 10                         
00000000  0f 01 17 0f 09 0c 0a 08  15 0c 0c 0f 01 17 0f 09  |................|
00000010  0c 0a 08 15 0c 0c 0f 01  17 0f 09 0c 0a 0f 01 17  |................|
00000020  0f 09 0c 0a 08 15 0c 0c  0f 01 17 0f 09 0c 0a 08  |................|
00000030  15 0c 0c 0f 01 17 0f 09  0c 0a 0f 01 17 0f 09 0c  |................|
00000040  0a 08 15 0c 0c 0f 01 17  0f 09 0c 0a 08 15 0c 0c  |................|
00000050  0f 01 17 0f 09 0c 0a 0f  01 17 0f 09 0c 0a 08 15  |................|
00000060  0c 0c 0f 01 17 0f 09 0c  0a 08 15 0c 0c 0f 01 17  |................|
00000070  0f 09 0c 0a 0f 01 17 0f  09 0c 0a 08 15 0c 0c 0f  |................|
00000080  01 17 0f 09 0c 0a 08 15  0c 0c 0f 01 17 0f 09 0c  |................|
00000090  0a 0f 01 17 0f 09 0c 0a  08 15 0c 0c 0f 01 17 0f  |................|

Die Ausgabe vonstty -aF /dev/ttyUSB0

skolodya@ubuntu:$ stty -aF /dev/ttyUSB0                                        
speed 9600 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^H; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 100; time = 2;
-parenb -parodd cs8 -hupcl -cstopb cread clocal -crtscts
-ignbrk brkint ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl ixon -ixoff
-iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon iexten -echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke

Update : Das Ausprobieren eines anderen Computers mit Ubuntu 14.04 32 Bit hat auch nicht funktioniert, das gleiche Ergebnis

Aktualisierung 20.04 .:

Ich habe sehr einfachen Code in die eingefügt main:

 while (1) {

        while (!PIR1bits.RC1IF);  //Wait for a byte
        sprintf(txStr,"%X",RCREG1);
        LCDWriteLine(txStr,0);
        continue;

Es soll den Hex-Wert von RCREG1auf dem LCD-Bildschirm anzeigen. Für aauf der Tastatur eingegebene Buchstaben erzeugt Windows wie erwartet 61, aber unter Linux bekomme ich E1. Seltsamerweise sind die letzten 4 Bits korrekt, unabhängig davon, was ich eingebe. Aber für die Top 4 erhalte ich normalerweise Werte von Dbis F. Also für den Hex-Wert 62 bekomme ich E2.

Was ist der Output dafür hexdump -Cist ein Kapital C?
Wozu dient die Ausgabe stty -aF /dev/ttyUSB0?
Dies kann bei der Fehlerbehebung helfen: git.linformatronics.nl/gitweb/?p=cat_usbCable;a=summary Fummeln Sie ein wenig an den Einstellungen in den Zeilen 31-35 herum. Vergessen Sie die udev-Datei in diesem Archiv, das löst das Problem der Eigentümer/Berechtigungen und Benennung. BEARBEITEN: Dies hilft nicht, da das Perl-Skript nur von der seriellen Schnittstelle liest
Zusätzliche Informationen wie gewünscht hinzugefügt
Anscheinend ist die Baudrate nicht richtig eingestellt. Sind Sie sicher, dass das Board für 9600Bd konfiguriert ist? Es sollten Einstellungen wie Baudrate, Anzahl der Datenbits, Anzahl der Stoppbits und Paritätstyp vorhanden sein. Ich persönlich mag es, wenn die native Linux-Version von PuTTY mit diesen Einstellungen herumspielt, bis ich sie richtig hinbekomme. Verwenden Sie Wine nicht mit der Windows-Version.
Überprüfen Sie man sttydie Bedeutung aller aufgeführten Flags.
Ja, 99% sicher, dass die Baudrate richtig eingestellt ist
Klicken Sie in Windows herum, bis Sie 9600 8N1 überprüfen können, für die Ihre Linux-Box konfiguriert zu sein scheint. 9600Bd 8 Bit Keine Parität und 1 Stoppbit. Ich bin kein Windows-Benutzer, aber sicherlich ist ik irgendwo in den Einstellungen zu finden.
Genau das sind die Einstellungen von Putty in Windows standardmäßig.
Prüfen Sie mit einem Oszilloskop den seriellen Ein- und Ausgang, es sollte ziemlich einfach sein, die Bitzeit herauszufinden. Ich habe früher einen Arduino dafür verwendet, es gibt Logikanalysator-Software für Arduino. Google nach "SUMP-kompatibler Logikanalysator für Arduino Andrew Gillham" und lxtreme.nl/ols Das heißt ... wenn Sie einen Ersatz herumliegen haben.
Ich habe ein Update hinzugefügt, bitte überprüfen

Antworten (2)

Es scheint, dass Ubuntu Bit7 in allen empfangenen Zeichen setzt.

Zum Beispiel: Das Senden von 'a' ist 0x61 oder 0b01100001 und es empfängt 0xE1 oder 0b11100001.

Im seriellen Format wird Bit0 zuerst und Bit7 zuletzt gesendet, daher kann dies passieren, wenn Ihre Terminaleinstellungen nicht übereinstimmen. Wenn der PIC beispielsweise 7 Datenbits, keine Parität, 1 Stoppbit sendet, aber Ubuntu 8 Datenbits, keine Parität, 1 Stopp erwartet, dann taktet Ubuntu ein zusätzliches Bit ein und Bit7 wird immer hoch sein.

Stellen Sie also sicher, dass Ihre USB-to-Serial/Terminal-Einstellungen genau mit den PIC-UART-Einstellungen übereinstimmen. Hoffentlich hilft das. - Vince

Ihre Stty-Einstellungen deaktivieren das lokale Echo (war das beabsichtigt?)

Versuchen Sie es mit minicom oder picocom anstelle von stty.
Du könntest es auch mit 'screen /dev/ttyUSB0 9600' versuchen.

screen /dev/ttyUSB0 9600ist genau das, was ich verbinde, aber kein Ergebnis. Die Baudrate ist zu 100% korrekt - das habe ich überprüft und erneut überprüft. Minicon ausprobiert, aber nicht picocom, mal sehen, ob das funktioniert. Echo .. . .interessante Beobachtung . . . Ich glaube, ich habe versucht, das lokale Echo einzustellen, bin mir aber nicht 100% sicher. Werde berichten wenn ich was erfahre
Habe eine kleine Änderung an meiner Frage vorgenommen, bitte überprüfen
Ich glaube auch, dass Ihre Terminaleinstellungen nicht mit dem Ziel übereinstimmen. Sie erhalten Daten und wissen, dass es mit Windows/puTTY funktioniert. Wenn Sie Ihr gesamtes Projekt lesen, möchten Sie, dass das lokale Echo deaktiviert ist.