Member 12871683 Ответов: 2

Как передать ESC/POS в writefile fileapi


<pre lang="text"у меня есть некоторые проблемы с командами ESC/POS. Приведенный ниже код хорошо печатает обычный текст, но когда он спускается по командам ESC/POS, принтер ничего не делает.>

HANDLE	CreateFileResult;
BOOL    bResult;
PSP_INTERFACE_DEVICE_DETAIL_DATA dummy = GetDevices();

if (dummy != 0)
	{
	CreateFileResult = CreateFile(dummy->DevicePath, 
                                      GENERIC_WRITE | GENERIC_READ, 
                                      FILE_SHARE_WRITE | FILE_SHARE_READ, 
                                      NULL, 
                                      OPEN_ALWAYS, 
                                      FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 
                                      NULL);

		if (INVALID_HANDLE_VALUE == CreateFileResult) 
        {
		  std::cout << "Handle Failed " << std::endl;
		}
		else
		{
			
		  char cData1[] = { (CHAR)27, (CHAR)112 , CHAR(0), CHAR(255), CHAR(0) };
		  char cData2[] = { 0x1b, 0x70 ,0x00 ,0xFF ,0x00 };
			
			DWORD dwBytesToWrite = (DWORD)strlen(cData2);
			DWORD bytesWritten;
			OVERLAPPED osWrite = { 0,0,0 };
				
			
			WriteFile(CreateFileResult, cData2, dwBytesToWrite, &bytesWritten, &osWrite);
         }


Что я уже пробовал:

Я перепробовал много различных способов передачи данных (см. cData1 & cData2). Может ли кто - нибудь помочь указать правильный способ передачи команды? - Спасибо, Оливер.

2 Ответов

Рейтинг:
0

Rick York

Проблема в том, что вы используете strlen для определения длины данных, но в строке есть нули, и strlen перестает считать, когда находит первый. Например, cData1 имеет пять байтов, а strlen вернет 2.

Вы должны просто посчитать байты и установить константу на это значение (4 или 5 - я не знаю, хотите ли вы последний null) и использовать его для проверки вашей логики. Когда вы получите, что работает правильно, то вы можете сделать его более гибким и общего назначения.


Рейтинг:
0

Jochen Arndt

Это не работает, потому что вы используете strlen() чтобы получить длину записываемых данных, но ваши данные являются двоичными и содержат нулевые байты. Таким образом, вы пишете только два байта (0x1B и 0x70), что является неполной командой. С помощью strlen() даже не будет работать должным образом, когда данные не содержат нулевого байта, если не добавить его в качестве Терминатора строки.

Потому что у тебя есть char массив с фиксированным размером, вместо него можно использовать размер массива:

DWORD dwBytesToWrite = sizeof(cData2);
Это позволит записать все пять байт.