Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / 9 бит данных по COM-порту / 8 сообщений из 8, страница 1 из 1
17.07.2017, 11:36
    #39490032
zvb7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
9 бит данных по COM-порту
Есть некое устройство (купюроприёмник), работающее по последдовательному порту по протоколу MDB (protocol, which is based on a Motorola 9-bit UART implemented as an 8-bit data value with an additional mode bit. The mode bit differentiates between ADDRESS and DATA bytes). Для реализации на PC рекомендуют использовать бит чётности.
Есть программа, работающая с этим устройством из-под Windows. Вот её обмен с устройством, записанный с помощью портмонитора (кусок, где непосредственно посылаются данные, при необходимости выложу всё):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
28	0.00000978	Mdb.exe	IOCTL_SERIAL_SET_BAUD_RATE	Serial0	SUCCESS	Rate: 9600	
29	0.00000587	Mdb.exe	IOCTL_SERIAL_CLR_RTS	Serial0	SUCCESS		
30	0.00000615	Mdb.exe	IOCTL_SERIAL_CLR_DTR	Serial0	SUCCESS		
31	0.00000419	Mdb.exe	IOCTL_SERIAL_SET_LINE_CONTROL	Serial0	SUCCESS	StopBits: 1 Parity: SPACE WordLength: 8	
32	0.00000307	Mdb.exe	IOCTL_SERIAL_SET_CHAR	Serial0	SUCCESS	EOF:0 ERR:0 BRK:0 EVT:0 XON:11 XOFF:13	
33	0.00000447	Mdb.exe	IOCTL_SERIAL_SET_HANDFLOW	Serial0	SUCCESS	Shake:0 Replace:0 XonLimit:2048 XoffLimit:512	
34	0.00000503	Mdb.exe	IRP_MJ_DEVICE_CONTROL	Serial0	SUCCESS	IOCTL: 0x1B009C	
35	0.00000251	Mdb.exe	IOCTL_SERIAL_GET_LINE_CONTROL	Serial0	SUCCESS		
36	0.00000475	Mdb.exe	IOCTL_SERIAL_SET_LINE_CONTROL	Serial0	SUCCESS	StopBits: 1 Parity: MARK WordLength: 8	
37	0.00000643	Mdb.exe	IOCTL_SERIAL_PURGE	Serial0	SUCCESS	Purge: TXABORT RXABORT TXCLEAR RXCLEAR	
38	0.00000615	Mdb.exe	IOCTL_SERIAL_SET_LINE_CONTROL	Serial0	SUCCESS	StopBits: 1 Parity: MARK WordLength: 8	
39	0.00002654	Mdb.exe	IRP_MJ_WRITE	Serial0	SUCCESS	Length 1: 33 	
40	0.00000559	Mdb.exe	IOCTL_SERIAL_SET_LINE_CONTROL	Serial0	SUCCESS	StopBits: 1 Parity: SPACE WordLength: 8	
41	0.00002375	Mdb.exe	IRP_MJ_WRITE	Serial0	SUCCESS	Length 1: 33 	
42	0.00000447	Mdb.exe	IOCTL_SERIAL_GET_COMMSTATUS	Serial0	SUCCESS		
43	0.00000223	Mdb.exe	IOCTL_SERIAL_GET_COMMSTATUS	Serial0	SUCCESS		
...
246	0.00000196	Mdb.exe	IOCTL_SERIAL_GET_COMMSTATUS	Serial0	SUCCESS		
247	0.00000279	Mdb.exe	IOCTL_SERIAL_GET_COMMSTATUS	Serial0	SUCCESS		
248	0.00000698	Mdb.exe	IRP_MJ_READ	Serial0	SUCCESS	Length 2: 06 06



Пытаюсь реализовать подобный обмен из своего кода, устройство не отвечает:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
hPort = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);

        DCB dcb;
	GetCommState(hPort, &dcb);
	//dcb.fParity = dcb.fErrorChar = 1;
	dcb.BaudRate = CBR_9600;
	dcb.ByteSize = 8;
	dcb.StopBits = ONESTOPBIT;
	dcb.Parity = EVENPARITY;
	SetCommState(hPort, &dcb);

	COMMTIMEOUTS timeouts;
	GetCommTimeouts(hPort, &timeouts);
	timeouts.ReadIntervalTimeout = 10;
	timeouts.ReadTotalTimeoutMultiplier = 11;
	timeouts.ReadTotalTimeoutConstant = 500;
	timeouts.WriteTotalTimeoutMultiplier = 11;
	timeouts.WriteTotalTimeoutConstant = 100;
	SetCommTimeouts(hPort, &timeouts);

	dcb.Parity = SPACEPARITY;
	SetCommState(hPort, &dcb);

	dcb.Parity = MARKPARITY;
	SetCommState(hPort, &dcb);

	PurgeComm(hPort, PURGE_RXABORT | PURGE_TXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);

	//SetCommMask(hPort, EV_ERR | EV_RXCHAR | EV_RXFLAG);

	dcb.Parity = MARKPARITY;
	SetCommState(hPort, &dcb);

	char buf[1024];
	buf[0] = 0x33;
	unsigned long nBytes;
	WriteFile(hPort, buf, 1, &nBytes, NULL);

	dcb.Parity = SPACEPARITY;
	SetCommState(hPort, &dcb);

	WriteFile(hPort, buf, 1, &nBytes, NULL);

	ReadFile(hPort, buf, 1, &nBytes, NULL);


Вопрос, как его победить?
...
Рейтинг: 0 / 0
17.07.2017, 11:44
    #39490045
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
9 бит данных по COM-порту
zvb7,

Перед посылкой каждого байта менять режим mark/space
...
Рейтинг: 0 / 0
17.07.2017, 11:56
    #39490057
zvb7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
9 бит данных по COM-порту
ИзопропилПеред посылкой каждого байта менять режим mark/space
Изопропил,

вроде так и делаю, см. последние два SetCommState.

Кстати, как той работающей программе, от которой лог, удаётся делать IOCTL_SERIAL_SET_LINE_CONTROL не меняя остальное (см. например строки лога 38 и 40)? У меня при вызове SetCommState происходит много чего, как в логе от строки 28 до строки 33.
...
Рейтинг: 0 / 0
17.07.2017, 12:01
    #39490063
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
9 бит данных по COM-порту
zvb7как его победить?

Для начала - начать проверять коды возврата функций. Потом - сравнивать результаты
портмонитора для работающей программы и твоей неработающей.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
17.07.2017, 12:09
    #39490079
zvb7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
9 бит данных по COM-порту
Dimitry Sibiryakov,
коды возврата сам-собой проверяю, все TRUE, просто не стал перегружать выкладываемый сюда код. Ну и портмонитором проверяю, что всё отрабатывает. Примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
43	0.00000894	MDBTest.exe	IOCTL_SERIAL_SET_BAUD_RATE	Serial0	SUCCESS	Rate: 9600	
44	0.00000503	MDBTest.exe	IOCTL_SERIAL_CLR_RTS	Serial0	SUCCESS		
45	0.00000503	MDBTest.exe	IOCTL_SERIAL_CLR_DTR	Serial0	SUCCESS		
46	0.00000363	MDBTest.exe	IOCTL_SERIAL_SET_LINE_CONTROL	Serial0	SUCCESS	StopBits: 1 Parity: MARK WordLength: 8	
47	0.00000307	MDBTest.exe	IOCTL_SERIAL_SET_CHAR	Serial0	SUCCESS	EOF:0 ERR:0 BRK:0 EVT:0 XON:11 XOFF:13	
48	0.00000419	MDBTest.exe	IOCTL_SERIAL_SET_HANDFLOW	Serial0	SUCCESS	Shake:0 Replace:4 XonLimit:2048 XoffLimit:512	
49	0.00002626	MDBTest.exe	IRP_MJ_WRITE	Serial0	SUCCESS	Length 1: 33 	
50	0.00000363	MDBTest.exe	IOCTL_SERIAL_GET_BAUD_RATE	Serial0	SUCCESS		
51	0.00000196	MDBTest.exe	IOCTL_SERIAL_GET_LINE_CONTROL	Serial0	SUCCESS		
52	0.00000223	MDBTest.exe	IOCTL_SERIAL_GET_CHARS	Serial0	SUCCESS		
53	0.00000168	MDBTest.exe	IOCTL_SERIAL_GET_HANDFLOW	Serial0	SUCCESS		
54	0.00000894	MDBTest.exe	IOCTL_SERIAL_SET_BAUD_RATE	Serial0	SUCCESS	Rate: 9600	
55	0.00000531	MDBTest.exe	IOCTL_SERIAL_CLR_RTS	Serial0	SUCCESS		
56	0.00000531	MDBTest.exe	IOCTL_SERIAL_CLR_DTR	Serial0	SUCCESS		
57	0.00000363	MDBTest.exe	IOCTL_SERIAL_SET_LINE_CONTROL	Serial0	SUCCESS	StopBits: 1 Parity: SPACE WordLength: 8	
58	0.00000223	MDBTest.exe	IOCTL_SERIAL_SET_CHAR	Serial0	SUCCESS	EOF:0 ERR:0 BRK:0 EVT:0 XON:11 XOFF:13	
59	0.00000391	MDBTest.exe	IOCTL_SERIAL_SET_HANDFLOW	Serial0	SUCCESS	Shake:0 Replace:4 XonLimit:2048 XoffLimit:512	
60	0.00088335	MDBTest.exe	IRP_MJ_WRITE	Serial0	SUCCESS	Length 1: 33 	
61	0.50943793	MDBTest.exe	IRP_MJ_READ	Serial0	TIMEOUT	Length 0: 	
...
Рейтинг: 0 / 0
17.07.2017, 14:48
    #39490216
zvb7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
9 бит данных по COM-порту
Можно и пару более общих вопросов сформулировать:

1. Я правильно понимаю, что все манипуляции, например с SetCommState до того, как я вызову WriteFile порту на самом деле по барабану? Посмотрим на лог от работающей программы - в строке 31 установилось Parity: SPACE, потом в 36 - Parity: MARK, потом в 38 опять Parity: MARK. Это зачем?

2. Что происходило в программе когда в лог вывелась строка 34, там где IRP_MJ_DEVICE_CONTROL IOCTL: 0x1B009C ? Хотя это наверное что-то другое.
...
Рейтинг: 0 / 0
18.07.2017, 19:31
    #39491148
Bred eFeM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
9 бит данных по COM-порту
zvb7все манипуляции, например с SetCommState до того, как я вызову WriteFile порту на самом деле по барабану?нет, RX будет с твоим State.

zvb72. Что происходило в программе когда в лог вывелась строка 34, там где IRP_MJ_DEVICE_CONTROL IOCTL: 0x1B009C ? Хотя это наверное что-то другое. http://www.rohitab.com/apimonitor


Читай по SetCommMask / WaitCommEvent (или каждые 100мс GetCommState как в оригинале) и с таймаутами, да ещё и на запись?, разберись.
...
Рейтинг: 0 / 0
21.07.2017, 14:27
    #39492975
zvb7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
9 бит данных по COM-порту
Помогла пауза 10мс между отправкой первого и второго байта. Всем спасибо.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / 9 бит данных по COM-порту / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]