Jag är förbryllad över dina '2 stoppbitar'.
Startbiten indikerar start av datat.
Stoppbiten markerar slutet av datat.
Däremellan kan man ha 7 eller 8 databitar samt paritet eller ingen paritet.
En 'alternativ standard' som finns på vissa uart's - är 1 startbit, 8 databitar, 1 programmerbar bit och 1 stoppbit.
Denna mod (mode 2 på dallas 80C320 t.ex.) används ofta för att kunna addressera flera UARTS i ett master- / slav-system.
Jag antar att det bara är ett smart utnyttjande av den (normalt) oanvända paritetsbiten.
Aldrig har jag sett 2 stoppbitar.
Interruptrutinen är en enkel som först tar emot en byte (som anger storleken på paketet), sen fyller den en buffer med resterande bytes.
Skilj på 'hårdvarunivån' (uarten, RS232 protokollet samt stoppbitens vara eller icke vara) och din egen protokollnivå (meddelandelängdbyten och själva meddelandet)
Skickar jag i block verkar det funka OK så länge jag inte skickar enbart 0xFF i blocket.
Om du kan skicka allt utom just bara 0xFF helt korrekt borde det inte vara fel på överföringen - annars skulle rimligtvis alla tecken / bytes bli fel.
Skickar jag kontinuerligt så skabbar det lite. Och i värsta fall hänger UART:en sig medans resterande kod funkar lite halvt.
Låter mer som fel inställda kommunikationsparametrar.
Har du kontroll över PC programmet som skickar datat och har möjlighet att modifiera det till något 'normalt' (typ 8N1) först - för att få ordning på din mottagningskod?
Är du säker på att data 'ser bra ut' i mottagande ända? Titta på det med ett oscilloskop eller liknande. Skicka 0xAA / 0xFF då det ger signaler som är lätta att studera.
Vissa handskrivna gamla DOS-program skickade bitarna för tätt. Det finns regler för hur lång tid som måste gå mellan föregående byte's stoppbit och nästa byte's startbit.
19200 är inte så himla snabbt och du har ju samma problem vid 9600, så jag tror inte baudraten är för hög eller att det är drivkretsarna som inte hänger med.
Tar du någon matning ifrån RS232-gränssnittet?
--
Själv har jag kört i 230k en gång. Attans vad fort det gick för seriesnöret.
