2010-01-31 2 views
2

레이블 프린터는 원시 ASCII 문자열 (레이블의 형식을 지정)을 전송하여 제어됩니다. 이와 같이 :.txt 파일에서 프린터를 제어하기위한 ASCII 원시 기호

string s = "\x02L\r" + "D11\r" + "ySWR\r" + "421100001100096" + date + "\r" + "421100002150096" + time + "\r" + "421100001200160" + price + "\r" + "E\r"; 

RawPrinterHelper.SendStringToPrinter(printerName, s); 

이 하드 코딩 된 변형은 잘 작동합니다.

이제 컨트롤 문자열을 .txt 파일에 저장하고 런타임 중에 읽으려고합니다. 이렇게 :

 string printstr; 
     TextReader tr = new StreamReader("print.txt"); 
     printstr = tr.ReadLine(); 
     tr.Close(); 

그러나이 경우 프린터는 아무것도 인쇄하지 않습니다.

이 (내가 MessageBox.Show(printstr); 모든 것을 보인다 OK. 비록, 우리는 추가 제어 문자를 볼 수 없습니다 이런 식으로 읽기 문자열을 넣으면) StreamReader이 문자열

에 뭔가를 추가하는 보인다.

이 문제의 해결책은 무엇입니까?

+0

'이 경우 프린터에서 아무것도 인쇄하지 않습니다'라는 의미는 무엇입니까? 문자열의 내용을 인쇄하는 것에 대해 이야기하고 있습니까? – t0mm13b

+0

아니요. 프린터가 아무것도 인쇄하지 않습니다. 제어 문자열이 오류로 포맷 된 경우이 경우처럼 작동하므로 StreamReader가 보이지 않는 문자를 추가한다고 가정합니다. 이 프린터는 문자열의 내용이 아닌 위의 예에서 날짜, 시간 및 가격만을 인쇄합니다. 나머지는 모두 기호 일 뿐이며 레이블을 형식화합니다. – rem

+0

내 편집 된 대답보기 :) – t0mm13b

답변

1

얼룩말 모양의 프린터처럼 보입니다. 불만이 있습니다. 가장 먼저 고쳐야 할 것은 print.txt 파일을 생성하는 방법입니다. \ r로 끝나는 명령 문자열의 각 섹션마다 한 행을 써야합니다. 예를 들어, 명령 문자열은 다음과 같이 기록한다 :

printFile.WriteLine("\x02L"); 
printFile.WriteLine("D11"); 
printFile.WriteLine("ySWR"); 
printFile.WriteLine("421100001100096" + date); 
printFile.WriteLine("421100002150096" + time); 
printFile.WriteLine("421100001200160" + price); 
printFile.WriteLine("E"); 
printFile.WriteLine(); 

이제에서는 ReadLine()를 사용하면 print.txt에서 레이블을 읽을 때. 전체 라벨을 보려면 여러 줄을 읽어야합니다. 마지막에 빈 줄을 추가 했으므로 파일을 읽을 때 레이블을 만드는 모든 줄이 있다는 것을 감지 할 때 사용할 수 있습니다. "\ r"을 프린터에 보낼 때 다시 추가하는 것을 잊지 마십시오.

+0

@nobugz 감사합니다! 그냥 손으로 타이핑해서이 .txt 파일을 편집해서는 안된다는 뜻입니까? 이 파일을 손으로 편집하는 것이 문제의 원인입니까? – rem

+0

음, 그럴 수도 있습니다. 일반적으로 \ x02 제어 코드를 텍스트 편집기로 파일에 저장하는 것은 어렵습니다. 나는 메모장이나 비주얼 스튜디오의 에디터로 어떻게하는지 모른다. 아니요, "\ x02"는 입력하지 않습니다. –

3

코드에서 tr.ReadLine()을 한 번 호출하지만 해당 문자열에 여러 줄이있는 것 같습니다.

1

StreamReader가 유니 코드 형식으로 읽을 수 있습니다.

 
string printstr; 
TextReader tr = new StreamReader("print.txt",System.Text.Encoding.ASCII); 
printstr = tr.ReadToEnd(); 
tr.Close(); 

또는 바이너리 파일로 읽기 : 그건 그렇고, 당신은 단지 한 줄 읽고 ... 당신은 ... 가장 좋은 방법이이 방법을 수행하는 것 대신에 라인을 반복 할 필요가 전체 청크를 대신 일련의 바이트로 읽으면 오류 검사가 생략됩니다.

 
System.IO.BinaryReader br = new System.IO.BinaryReader(new StreamReader("print.txt", System.Text.Encoding.ASCII)); 
byte[] data = br.ReadBytes(br.BaseStream.Length); 
br.Close(); 

편집 : 여기이 추가 조각을 포함하도록 최선을 생각 REM의 의견 후 ...이 변수 data가 참조 이전 코드 조각에서에 다음과 ...

 
string sData = System.Text.Encoding.ASCII.GetString(data); 

희망이, 안부, 톰을하는 데 도움이됩니다.

+0

감사합니다, Tom! 바이너리 파일로 읽는 경우 프린터로 보내기 전에 "byte [] 데이터"를 문자열로 되돌릴 수 있습니까? – rem

+0

한 줄만 읽는 StreamReader ("\ r"기호 때문이라고 생각하십니까?), MessageBox로 읽은 다음 문자열을 표시하면 .txt 파일에 전체 문자열이 표시됩니다. 어떠한 누락도없이. – rem

+0

@rem : '\ r'에 대한 답변의 편집 된 부분을 참조하십시오. 표준 줄 끝은 '\ r \ n'이고, 대신 System.Environment.Newline을 사용하는 것이 좋습니다. 하드 코딩 된 버전을 사용하여보다 강력하고 플랫폼을 이식 할 수 있습니다. – t0mm13b

관련 문제