2010-04-15 9 views
8

Sto lavorando su un sistema embedded e sto avendo dei drammi che ottengono l'invio di una certa quantità di dati attraverso la porta seriale. L'ho ristretto e ho scoperto che se un 0x9B è presente nel messaggio, corrompe il messaggio.0x9B (155decimal) è un carattere di controllo speciale? Perché manca ai tavoli ascii?

Quindi ho cercato 0x9b (155) su http://www.asciitable.com/ e manca! Non è una coincidenza bizzarra!

Qualche idea, si tratta di un personaggio speciale o qualcosa del genere?

-edit- Okay scusa ragazzi, non era lo 0x9b a causare questo, era un carattere 0x11. Quale ... drumroll ... è un personaggio XON/XOFF. Ho erroneamente controllato il flusso come xon/xoff sul computer e nessun controllo di flusso sul dispositivo! Grazie comunque dell'aiuto.

+7

ASCII va solo fino a 127 (0x7f hex). –

+1

Bene, esteso ascii se vuoi. – Chris

+0

Com'è la corruzione? La connessione si interrompe o si ottiene una sequenza di byte che non corrisponde all'ingresso? In tal caso, che aspetto ha? –

risposta

1

Suppongo che sia un 0x1B, ovvero il carattere di escape ASCII, con un bit di parità nell'ottava posizione di bit (proveniente dalla comunicazione seriale e tutto).

Tecnicamente, i caratteri del set ASCII sono tutti minore o uguale a 0x7F, caratteri tra 0x80 a 0xFF sono parte della esteso ASCII. Il significato dei codici sopra 0x7F varia in genere, consentendo a uno di più set di caratteri di essere gestiti con codici di dimensioni esattamente un byte. Questa capacità introduce purtroppo ambiguità perché sia ​​necessario conoscere il particolare set di caratteri in più in uso (la "code page", se lo si desidera).
Ad esempio, la tabella "ASCII" a cui si fa riferimento nella domanda non sembra avere alcun carattere associato a 0x9B, mentre molti altri set ASCII estesi usano questo carattere "normale"/visualizzabile (es: un carattere in ISO -8859-1, il segno del centesimo (un carattere simile a C) con un altro set ecc.

Il possibile significato del carattere 0x9B potrebbe quindi dipendere dal set di caratteri [impliciti] in uso con l'applicazione sottostante. detto in precedenza, sembra più che i caratteri siano codificati su 7 bit (quindi sono probabilmente caratteri ASCII puri) con un bit di parità

+0

Hmm, non ne sono così sicuro: le mie impostazioni di comunicazione sono 8N1 - 8 bit, nessuna parità, 1 bit di stop – Chris

+0

@Chris, potrebbe essere un bit di parità _logical_, cioè gestito al livello del file/contenuto, non uno aggiunto con il dispositivo di comunicazione seriale. (Tipo di impostazione "cintura + bretelle" se la seriale COM include anche un bit di parità.) Si può verificare ciò affermando che ad esempio non si ha mai 0x41 o 0x42 (ma invece 0xC1 e 0xC2 rispettivamente) e che al contrario, si sempre avere 0x43 (e mai 0xC3). (Indovina ...) – mjv

+0

@Chris: inoltre, ricorda che non è perché un lato della comunicazione seriale è impostato come 8 bit nessuna parità che l'altro lato non potrebbe essere 7 bit più parità ... (secondo pensiero , possibilmente dispari, _literalmente_ dal momento che in genere le comunicazioni seriali usano un bit di parità pari, non una parità dispari ...) – mjv

6

Nelle sequenze di escape ANSI, 0x9B è il carattere unico Control Sequence Introducer (la versione multi-caratteri che è più familiare è ESC-[.

2

0x9B è il CSI o "controllo di sequenza introduttore" parte del set C1 di codici di controllo suo, vedere qui: http://www.search.com/reference/C0_and_C1_control_codes

Supponendo dati sta attraversando uno strato che elabora codici di controllo C1 non sorprendente che ci sono pochi byte mancanti dopo questo carattere, in quanto viene utilizzato per indicare l'inizio di una sequenza di escape ansi. I byte stanno scomparendo perché alcuni livelli li cancellano come parte di un'istruzione. Maggiori informazioni su questo qui: http://en.wikipedia.org/wiki/Control_Sequence_Introducer

Ovviamente non è possibile garantire questo è il tuo problema, ma è dove vorrei iniziare a scavare nella documentazione API sulla base dei sintomi che hai descritto.

2

Se il carattere prima di 0x9B è 0x10 (DLE - carattere di escape del collegamento dati) che potrebbe spiegare i caratteri persi che si vedono. Alcuni dispositivi utilizzano DLE come indicatore di comando di controllo e il carattere successivo è il comando. Se i caratteri DLE non sono sfuggiti, il solito segno è una perdita di 2 caratteri nel flusso o uno strano comportamento dal dispositivo. Esegui caratteri DLE con DLE.Quindi, nel tuo caso se il flusso di dati comprende:

... 0x10 0x9b ...

si dovrebbe scrivere

... 0x10 0x10 0x9b ...

0

Per chiunque venga a questa domanda solo per il titolo: 0x9B/155 manca dalle tabelle ASCII perché non è un carattere ASCII. caratteri ASCII sono larghe solo 7 bit, il che significa ci sono solo 128 di loro, semplicemente è alcun carattere 155.

[Community Wiki, perché in realtà non rispondere alla domanda, solo il titolo.]

+0

Bene, 154 e 156 sono nella tabella ascii che stavo guardando, mancava solo 155! Comunque ho capito il problema, era un errore di configurazione xon/xoff. – Chris