http://blog.csdn.net/jing_xin/article/details/41444063
针对BEIYANG收据打印机 BTP-R580测试通过。
操作说明:http://www.docin.com/p-395110672.html
1、一般的打印
static Font printFont; //打印使用的字体
public static void PrintEventPage(object sender, PrintPageEventArgs e)
{
float yPos = 0;
int count = 0;
float leftMargin = e.MarginBounds.Left;
float topMargin = e.MarginBounds.Top;
//string line = null;
//string subs = " ";
string context = null;
//打印字体
printFont = new Font("宋体", 14F, FontStyle.Bold | FontStyle.Underline);
//打印内容
context = "收银小票";
//打印的位置
yPos = topMargin + (count * printFont.GetHeight(e.Graphics));
e.Graphics.DrawString(context, printFont, Brushes.Black,
50, 10, new StringFormat());
//换行
count++;
e.HasMorePages = false;
}
调用处:
System.Windows.Forms.PrintDialog PrintDialog1 = new PrintDialog();
System.Drawing.Printing.PrintDocument docToPrint = new System.Drawing.Printing.PrintDocument();
docToPrint.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(PrintEventPage);
PrintDialog1.AllowSomePages = true;
PrintDialog1.ShowHelp = true;
PrintDialog1.Document = docToPrint;//把PrintDialog的Document属性设为上面配置好的PrintDocument的实例
PrintController printController = new StandardPrintController();
docToPrint.PrintController = printController;
DialogResult result = PrintDialog1.ShowDialog();//调用PrintDialog的ShowDialog函数显示打印对话框
//If the result is OK then print the document.
if (result == DialogResult.OK)
{
docToPrint.Print();//开始打印
}
效果:直接调出设置打印机的窗口。
2、USB打印
思路:
1、先找到USB 打印机。SetupDiGetClassDevs、SetupDiEnumDeviceInfo、SetupDiGetDeviceRegistryProperty,找到“USB 支持设备”;
2、然后就是老路,获得该USB打印机的路径,SetupDiEnumDeviceInterfaces、SetupDiGetInterfaceDeviceDetail,获得路径。(SetupDiGetClassDevs不用了,因为1中已经获得句柄集)
3、再根据路径CreateFile,后面的内容网上一搜一大堆。
步骤:
1、CreateFile
2、SetupComm
3、SetCommTimeouts
4、GetCommState
5、SetCommState
6、PurgeComm
7、WriteFile
不知道是不是绕远路了,呵呵。
参考资料:http://www.cnblogs.com/SunYu/archive/2010/04/29/1723977.html
参考代码:http://www.codeproject.com/Articles/14500/Detecting-Hardware-Insertion-and-or-Removal
USB下直接用程序访问不太方便,于是利用下面这个连接里的方法进行LPT并口转换:
http://www.yt-pos.com/ask/question.php?id=263
然后就可以连接上打印机了。
参考其他网站:
http://bbs.csdn.net/topics/390085304?page=1#post-398581498
http://www.cnblogs.com/zbo/archive/2009/07/11/1521454.html
打印输出并切纸操作:
第一点:
const uint GENERIC_READ =0x80000000;
const uint GENERIC_WRITE = 0x40000000;
const int OPEN_EXISTING = 3;
private FileStream fs=null;
IntPtr iHandle;
[DllImport("kernel32.dll")]
public static extern IntPtr CreateFileA(string lpFileName, uint dwDesiredAccess, int dwShareMode, int lpSecurityAttributes, int dwCreationDisposition, int dwFlagsAndAttributes, int hTemplateFile);
[DllImport("kernel32.dll")]
private static extern bool WriteFile(
int hFile,
byte[] lpBuffer,
int nNumberOfBytesToWrite,
ref int lpNumberOfBytesWritten,
ref int i
);
[DllImport("kernel32.dll")]
private static extern bool CloseHandle(IntPtr hObject);
第二点:
protected void imageButton1_Click(object sender, ImageClickEventArgs e)
{
ShopCart mycart = CartCtroller.GetCart();
iHandle = CreateFileA("LPT1", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
if (iHandle.ToInt32() == -1)
{
Jscript.AjaxRunJs(this.Page, "alert('没有连接打印机或者打印机端口不是LPT1!')");
return;
}
else
{
fs = new FileStream(iHandle, FileAccess.ReadWrite);
//for (int i = 0; i < 5; i++)
//{
// fs.WriteByte(0x0A); //走纸(忘记了可能是这个)
//}
//StreamReader sr = new StreamReader(fs); //读数据;
//StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.Default); //些数据;
if (mycart.Count == 0)
{
Jscript.AjaxRunJs(this.Page, "alert('请先购买产品!')");
return;
}
byte[] buf = new byte[500];
char ESC = (char)(27);
char GS = (char)(29);
char LF = (char)(10);
//读出数据
StringBuilder SEND = new StringBuilder();
//SEND.Append(LF.ToString());
char c1 = (char)60;
char c2 = (char)0;
SEND.Append(GS.ToString() + "L" + c1.ToString() + c2.ToString());
SEND.Append(ESC + "D" + Convert.ToChar(25) + Convert.ToChar(30) + Convert.ToChar(0));
string dt = DateTime.Now.ToString();
string mingcheng = "产品名称:";
string miaoshu = "产品描述:";
string shuliang = "购买数量:";
string zhi = "支";
SEND.Append(LF.ToString());
SEND.Append("欢 迎 光 临 - 上海金福");
SEND.Append("\r\n");
SEND.Append("-------------------------------");
SEND.Append(LF.ToString());
SEND.Append("购买时间:"+dt);
SEND.Append("\r\n");
SEND.Append("-------------------------------");
SEND.Append(LF.ToString());
SEND.Append(LF.ToString());
for (int i = 0; i < mycart.Count; i++)
{
modelArrayProduct temp = (modelArrayProduct)mycart[i];
SEND.Append(mingcheng + temp.T_name);
SEND.Append("\r\n");
SEND.Append(miaoshu + temp.T_miaoshu);
SEND.Append("\r\n");
SEND.Append(shuliang + temp.T_shuliang.ToString() + zhi);
SEND.Append("\r\n");
SEND.Append("-------------------------------");
SEND.Append(LF.ToString());
}
//走纸
SEND.Append(LF.ToString());
SEND.Append(LF.ToString());
SEND.Append(LF.ToString());
SEND.Append(LF.ToString());
SEND.Append(GS + "V" + Convert.ToChar(1));
//字符类型转换
Encoding utf8 = Encoding.GetEncoding(65001);
Encoding gb2312 = Encoding.GetEncoding("gb2312");//Encoding.Default ,936
byte[] tempa = utf8.GetBytes(SEND.ToString());
buf = Encoding.Convert(utf8, gb2312, tempa);
fs.Write(buf, 0, buf.Length);
fs.Close();
}
CloseHandle(iHandle);
}
C#执行批处理命令
using System.Diagnostics ;
using System.IO;
private void btnRun_Click(object sender, EventArgs e)
{
txtResult.Text = "";
processCommand("Ping.exe", this.txtAddress.Text);
processCommand("Ping.exe", this.txtAddress.Text);
}
public void processCommand(string commandName, string argument)
{
ProcessStartInfo start = new ProcessStartInfo(commandName);//设置运行的命令行文件问ping.exe文件,这个文件系统会自己找到
//如果是其它exe文件,则有可能需要指定详细路径,如运行winRar.exe
start.WorkingDirectory = "d:\\360Downloads\\";
start.Arguments = argument;//设置命令参数
start.CreateNoWindow = true;//不显示dos命令行窗口
start.RedirectStandardOutput = true;//
start.RedirectStandardInput = true;//
start.UseShellExecute = false;//是否指定操作系统外壳进程启动程序
txtResult.AppendText(start.WorkingDirectory + "\n");
Process p = Process.Start(start);
StreamReader reader = p.StandardOutput;//截取输出流
string line = reader.ReadLine();//每次读取一行
while (!reader.EndOfStream)
{
txtResult.AppendText(line + "\n");
line = reader.ReadLine();
}
p.WaitForExit();//等待程序执行完退出进程
p.Close();//关闭进程
reader.Close();//关闭流
}
以上均测试成功。
补充BEIYANG BTP-R580相关参数:
主要参数 |
---|
打印方式 | 热敏打印 | 分辨率 | 203×203dpi |
---|---|---|---|
最高打印速度 | 230mm/s | 打印宽度(mm) | 80 |
基本参数 |
---|
打印方式 | 热敏打印 | 分辨率 | 203×203dpi |
---|---|---|---|
最高打印速度 | 230mm/s |
高级参数 |
---|
打印宽度(mm) | 80 | 打印方向 | 双向打印 |
---|---|---|---|
纸张种类 | 连续纸, 标记纸, 标签纸 | 纸张厚度 | 0.06mm-0.1mm |
字体 | ASCII(12×24), 压缩 ASCII(9×17), 国标宋体I, Ⅱ级(24×24), 国际字符 | 供纸方式 | 自动 |
接口类型 | 并行接口(IEEE 1284), RS-232, RS-485/422串行接口, USB接口, Ethernet接口, WLAN接口可选 |
电源参数 |
---|
电源电压(V) | 220±10% | 电源频率(Hz) | 50-60 |
---|
外观参数 |
---|
颜色 | 黑色 | 重量(Kg) | 1.3 |
---|---|---|---|
高度(mm) | 147 | 宽度(mm) | 147 |
长度(mm) | 205 |
测试打印机二:
ESPON TM TM58 票据打印机
爱普生 T58 基本参数 | |
产品类型: | 微型热敏打印机 |
打印方式: | 热敏式 |
打印宽度: | 32/16 |
缓冲区: | 2KB |
接口类型: | RS-232,Bi-directionalparallel |
爱普生 T58 打印性能 | |
打印速度: | 最大100mm/sec |
打印分辨率: | 360dpi |
字符集: | 95Alphanumeric,37 International,128×1Graphic |
字体: | 12×24(ANK)/24×24(Chinese) |
爱普生 T58 介质规格 | |
介质宽度: | 57.5±0.5mm |
介质厚度: | 0.06-0.07mm |
爱普生 T58 其它参数 | |
平均无故障时间: | 160000小时 |
产品尺寸: | 116×204×137mm |
产品重量: | 1.3kg |
系统平台: | Windows2000/XP |
电源电压: | DC24V(±7%),1.1A |
其它特性: | 字符尺寸:1.25×3.0mm/2.5×3.0mm 每英寸字符数:16.9cpi/10.2cpi D.K.D.功能:2drives 外壳颜色:ECW 安全标准:CCC 电源:Exclusive AC adapter(included) 配件:AC adapter,I/F cable,User’s manual 安全标准:UL/CSA/T+V(E N60950) |
另参考: