Странная проблема записи в SerialPort (C #) ... Работает после запуска другой программы - PullRequest
0 голосов
/ 30 июля 2009

Я пытаюсь записать на ЖК-дисплей, используя System.IO.Ports в C #, с классом SerialPort.

Во-первых, это работает! Моя программа успешно пишет в нее, и она отображается нормально ... но только после того, как я запустил предыдущую программу обработки данных (LCDC).

Если я запускаю по программе перед запуском LCDC (программа с полным графическим интерфейсом на ЖК-дисплее) - ЖК-дисплей остается пустым, даже не мерцая.

Если я «Начать отображение» на LCDC (то есть сделать так, чтобы он отображал хотя бы один экран из каталога LCDC), а затем «Остановить отображение» и полностью выключить LCDC; и затем запустить мою программу, она работает абсолютно нормально.

Таким образом, кажется, что LCDC активирует или инициализирует COM / последовательный порт или что-то еще, что порт запоминает после завершения работы программы. У кого-нибудь есть идеи?

Я испробовал бесчисленные примеры кода с использованием SerialPort (из различных онлайн-ресурсов), и у них у всех одна и та же проблема - ничего до LCDC, но полная функциональность после.

Я могу опубликовать код, если вам нужно, но это стандарт: объявить порт SerialPort

port.Open (x, y z); port.Write ( "строка");

и т.д.. и работает нормально после запуска LCDC!

Как обновление, я все еще застрял! Я использовал PortMon для анализа порта, во-первых, для моей программы, работающей в одиночку:

0   0.04459980  MatOrbOfficialT IRP_MJ_CREATE   VCP0    SUCCESS Options: Open   
1   0.00000531  MatOrbOfficialT IOCTL_SERIAL_GET_PROPERTIES VCP0    SUCCESS     
2   0.00000335  MatOrbOfficialT IOCTL_SERIAL_GET_MODEMSTATUS    VCP0    SUCCESS     
3   0.00000251  MatOrbOfficialT IOCTL_SERIAL_GET_BAUD_RATE  VCP0    SUCCESS     
4   0.00000251  MatOrbOfficialT IOCTL_SERIAL_GET_LINE_CONTROL   VCP0    SUCCESS     
5   0.00000223  MatOrbOfficialT IOCTL_SERIAL_GET_CHARS  VCP0    SUCCESS     
6   0.00000251  MatOrbOfficialT IOCTL_SERIAL_GET_HANDFLOW   VCP0    SUCCESS     
7   0.00000307  MatOrbOfficialT IOCTL_SERIAL_GET_BAUD_RATE  VCP0    SUCCESS     
8   0.00000223  MatOrbOfficialT IOCTL_SERIAL_GET_LINE_CONTROL   VCP0    SUCCESS     
9   0.00000196  MatOrbOfficialT IOCTL_SERIAL_GET_CHARS  VCP0    SUCCESS     
10  0.00000196  MatOrbOfficialT IOCTL_SERIAL_GET_HANDFLOW   VCP0    SUCCESS     
11  0.00216620  MatOrbOfficialT IOCTL_SERIAL_SET_BAUD_RATE  VCP0    SUCCESS Rate: 19200 
12  0.00295484  MatOrbOfficialT IOCTL_SERIAL_SET_RTS    VCP0    SUCCESS     
13  0.00297244  MatOrbOfficialT IOCTL_SERIAL_CLR_DTR    VCP0    SUCCESS     
14  0.00297496  MatOrbOfficialT IOCTL_SERIAL_SET_LINE_CONTROL   VCP0    SUCCESS StopBits: 1 Parity: NONE WordLength: 8  
15  0.00000251  MatOrbOfficialT IOCTL_SERIAL_SET_CHAR   VCP0    SUCCESS EOF:1a ERR:0 BRK:0 EVT:1a XON:11 XOFF:13    
16  0.00501293  MatOrbOfficialT IOCTL_SERIAL_SET_HANDFLOW   VCP0    SUCCESS Shake:0 Replace:40 XonLimit:1024 XoffLimit:1024 
17  0.00000251  MatOrbOfficialT IOCTL_SERIAL_GET_BAUD_RATE  VCP0    SUCCESS     
18  0.00000223  MatOrbOfficialT IOCTL_SERIAL_GET_LINE_CONTROL   VCP0    SUCCESS     
19  0.00000223  MatOrbOfficialT IOCTL_SERIAL_GET_CHARS  VCP0    SUCCESS     
20  0.00000223  MatOrbOfficialT IOCTL_SERIAL_GET_HANDFLOW   VCP0    SUCCESS     
21  0.00282829  MatOrbOfficialT IOCTL_SERIAL_SET_BAUD_RATE  VCP0    SUCCESS Rate: 19200 
22  0.00293892  MatOrbOfficialT IOCTL_SERIAL_SET_RTS    VCP0    SUCCESS     
23  0.00296909  MatOrbOfficialT IOCTL_SERIAL_CLR_DTR    VCP0    SUCCESS     
24  0.00297719  MatOrbOfficialT IOCTL_SERIAL_SET_LINE_CONTROL   VCP0    SUCCESS StopBits: 1 Parity: NONE WordLength: 8  
25  0.00000279  MatOrbOfficialT IOCTL_SERIAL_SET_CHAR   VCP0    SUCCESS EOF:1a ERR:0 BRK:0 EVT:1a XON:11 XOFF:13    
26  0.00294954  MatOrbOfficialT IOCTL_SERIAL_SET_HANDFLOW   VCP0    SUCCESS Shake:0 Replace:40 XonLimit:1024 XoffLimit:1024 
27  0.00288919  MatOrbOfficialT IOCTL_SERIAL_CLR_DTR    VCP0    SUCCESS     
28  0.00000447  MatOrbOfficialT IOCTL_SERIAL_GET_BAUD_RATE  VCP0    SUCCESS     
29  0.00000223  MatOrbOfficialT IOCTL_SERIAL_GET_LINE_CONTROL   VCP0    SUCCESS     
30  0.00000251  MatOrbOfficialT IOCTL_SERIAL_GET_CHARS  VCP0    SUCCESS     
31  0.00000223  MatOrbOfficialT IOCTL_SERIAL_GET_HANDFLOW   VCP0    SUCCESS     
32  0.00285763  MatOrbOfficialT IOCTL_SERIAL_SET_BAUD_RATE  VCP0    SUCCESS Rate: 19200 
33  0.00296406  MatOrbOfficialT IOCTL_SERIAL_CLR_RTS    VCP0    SUCCESS     
34  0.00298753  MatOrbOfficialT IOCTL_SERIAL_CLR_DTR    VCP0    SUCCESS     
35  0.00292132  MatOrbOfficialT IOCTL_SERIAL_SET_LINE_CONTROL   VCP0    SUCCESS StopBits: 1 Parity: NONE WordLength: 8  
36  0.00000559  MatOrbOfficialT IOCTL_SERIAL_SET_CHAR   VCP0    SUCCESS EOF:1a ERR:0 BRK:0 EVT:1a XON:11 XOFF:13    
37  0.00491962  MatOrbOfficialT IOCTL_SERIAL_SET_HANDFLOW   VCP0    SUCCESS Shake:0 Replace:0 XonLimit:1024 XoffLimit:1024  
38  0.00292942  MatOrbOfficialT IOCTL_SERIAL_CLR_RTS    VCP0    SUCCESS     
39  0.00000475  MatOrbOfficialT IOCTL_SERIAL_SET_TIMEOUTS   VCP0    SUCCESS RI:-1 RM:-1 RC:-2 WM:0 WC:0 
40  0.00245674  MatOrbOfficialT IOCTL_SERIAL_SET_WAIT_MASK  VCP0    SUCCESS Mask: RXCHAR RXFLAG CTS DSR RLSD BRK ERR RING   
41  0.00000670  MatOrbOfficialT IOCTL_SERIAL_SET_QUEUE_SIZE VCP0    SUCCESS InSize: 4096 OutSize: 2048  
42  0.00000000  MatOrbOfficialT IOCTL_SERIAL_WAIT_ON_MASK   VCP0            
43  0.00049811  MatOrbOfficialT IRP_MJ_WRITE    VCP0    SUCCESS Length 2: .X    

Тогда для LCDC:

0   0.05153979  LCDC.exe    IRP_MJ_CREATE   VCP0    SUCCESS Options: Open   
1   0.00000503  LCDC.exe    IOCTL_SERIAL_SET_QUEUE_SIZE VCP0    SUCCESS InSize: 1024 OutSize: 1024  
2   0.00000251  LCDC.exe    IOCTL_SERIAL_GET_BAUD_RATE  VCP0    SUCCESS     
3   0.00000279  LCDC.exe    IOCTL_SERIAL_GET_LINE_CONTROL   VCP0    SUCCESS     
4   0.00000223  LCDC.exe    IOCTL_SERIAL_GET_CHARS  VCP0    SUCCESS     
5   0.00000251  LCDC.exe    IOCTL_SERIAL_GET_HANDFLOW   VCP0    SUCCESS     
6   0.00274029  LCDC.exe    IOCTL_SERIAL_SET_BAUD_RATE  VCP0    SUCCESS Rate: 19200 
7   0.00299563  LCDC.exe    IOCTL_SERIAL_CLR_RTS    VCP0    SUCCESS     
8   0.00295205  LCDC.exe    IOCTL_SERIAL_CLR_DTR    VCP0    SUCCESS     
9   0.00289757  LCDC.exe    IOCTL_SERIAL_SET_LINE_CONTROL   VCP0    SUCCESS StopBits: 1 Parity: NONE WordLength: 8  
10  0.00000531  LCDC.exe    IOCTL_SERIAL_SET_CHAR   VCP0    SUCCESS EOF:b0 ERR:1 BRK:1 EVT:0 XON:79 XOFF:13 
11  0.00296155  LCDC.exe    IOCTL_SERIAL_SET_HANDFLOW   VCP0    SUCCESS Shake:0 Replace:0 XonLimit:256 XoffLimit:256    
12  0.00000307  LCDC.exe    IOCTL_SERIAL_SET_TIMEOUTS   VCP0    SUCCESS RI:-1 RM:0 RC:0 WM:100 WC:1000  
13  0.00251401  LCDC.exe    IOCTL_SERIAL_SET_WAIT_MASK  VCP0    SUCCESS Mask: RXCHAR ERR    
14  0.00000335  LCDC.exe    IOCTL_SERIAL_GET_MODEMSTATUS    VCP0    SUCCESS     
15  0.00000251  LCDC.exe    IOCTL_SERIAL_GET_MODEMSTATUS    VCP0    SUCCESS     
16  0.00000251  LCDC.exe    IOCTL_SERIAL_GET_MODEMSTATUS    VCP0    SUCCESS     
17  0.00000391  LCDC.exe    IOCTL_SERIAL_PURGE  VCP0    SUCCESS Purge: TXCLEAR RXCLEAR  
18  0.00066545  LCDC.exe    IRP_MJ_WRITE    VCP0    SUCCESS Length 3: .P.   
19  3.94750981  LCDC.exe    IOCTL_SERIAL_WAIT_ON_MASK   VCP0    SUCCESS     
20  0.00091632  LCDC.exe    IRP_MJ_WRITE    VCP0    SUCCESS Length 3: ...   

Есть идеи?

Я заметил, что LCDC выполнил IOCTL_SERIAL_PURGE прямо перед записью, но моя программа делает это при отключении - и после подключения он все еще не работает (поэтому я предполагаю, что это не связано с этой очисткой).

Если я снова запускаю свою программу после LCDC, она выглядит точно так же, за исключением:

26 0.00294954 MatOrbOfficialT IOCTL_SERIAL_SET_HANDFLOW VCP0 УСПЕХ Встряхнуть: 0 Заменить: 0 XonLimit: 1024 XoffLimit: 1024

Где написано Заменить: 0 используется для чтения Заменить: 40, это важно?

Насколько я могу судить ... все другие значения, установленные LCDC, сбрасываются моей программой после того, как я ее запустил, так что, конечно, не должно быть никакой разницы, что некоторые значения отличаются? Учитывая, что моя программа успешно пишет ... Только после того, как LCDC завершит свою работу!

Ответы [ 4 ]

2 голосов
/ 30 июля 2009

Во-первых, я бы подумал, что это не то, что настраивается на последовательном порту вашего компьютера, а скорее некоторая инициализация, которая требуется ЖК-дисплею перед началом отправки данных.

Я бы порекомендовал вам запустить трассировщик на последовательном порту, чтобы увидеть, что другое приложение отправляет на ЖК-дисплей, прежде чем оно отправит первую строку текста для отображения.

Вы можете попробовать Portmon от Sysinternals (теперь часть Microsoft).

1 голос
/ 30 июля 2009

Недавно я столкнулся с почти идентичной проблемой с последовательным портом связи. Я попытался бы подключиться к своему устройству, и никакие коммуникации не работали бы должным образом. Затем я бы открыл программу мониторинга последовательного порта, чтобы посмотреть, действительно ли я получаю какую-либо передачу данных, и все будет хорошо. Наконец, я попытался бы снова подключиться и смог бы правильно общаться.

То, что происходило в моем случае, было то, что я не устанавливал скорость передачи в бодах, таймауты чтения / записи и характеристики данных (биты данных, стоп-биты, биты четности) в моей программе. Программа отладки делала это автоматически, и эти изменения, казалось, «зависели» от последовательного порта, поэтому моя программа будет работать после однократного запуска программы отладки.

Убедитесь, что вы правильно установили все этих настроек в вашей программе.

1 голос
/ 30 июля 2009

Убедитесь, что ваше рукопожатие соответствует тому, что ожидает другой конец. Попробуйте установить для DTR и RTS значение true.

sPort.Dtr = true;
sPort.Rts = true;
0 голосов
/ 30 июля 2009

У меня были похожие проблемы с подключением к двигателю, когда запуск другого приложения сначала вызвал работу моего приложения.

В результате возникла проблема с шумом на последовательном порту, как при записи, так и при чтении. Отправка тестовых / нежелательных сообщений и очистка входного и выходного буферов в конечном итоге решили проблему. В моем случае другое приложение просто удаляло мусор из буферов.

...