条码阅读器的问题?

sallyXY 2003-10-16 11:01:37
有谁做过条码阅读器方面的程序,如超市收银系统,详细一点的再高分奉送。
...全文
219 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
sallyXY 2003-11-02
  • 打赏
  • 举报
回复
谢谢各位,没有补充的话就准备结了。
GodBirdFlying 2003-11-02
  • 打赏
  • 举报
回复
To hatumei(明月) 发完好不好?
chifengwatch 2003-11-02
  • 打赏
  • 举报
回复
1、接上条码枪
2、开个记事本文档,扫。:)

我补充一点,如果你要生成条码,需要找一些控件、或字体。
runnerrunning 2003-11-01
  • 打赏
  • 举报
回复
也就是一个输入的方式,主要的控制就是在需要条码的时候给定控件输入焦点,激活设备,等条码扫描完毕结束焦点,并且disable设备
sinozw 2003-10-31
  • 打赏
  • 举报
回复
买条码阅读器时难道没有提供相应的驱动程序吗?
szzdbf 2003-10-31
  • 打赏
  • 举报
回复
若有条形码阅读器,其作用与一般输入设备是一样的.且在读入时,能触发onkeypress事件,对此事件编程,十分有用.
fancy05 2003-10-31
  • 打赏
  • 举报
回复
学习
hatumei 2003-10-16
  • 打赏
  • 举报
回复
如果是从串口提取数据的话,我有一个类可以访问串口。
是我改进的,有些属性设置还没有做。已经测试通过,支持事件(WM_SERIAL_RECEIVE)。
用的时候需要定义一个外部的hInstance.我把它公布出来,请大家不吝指正。
//serial.h文件
#ifndef __SERIAL_H
#define __SERIAL_H
#include <vcl.h>
#pragma hdrstop
#define WM_SERIAL_RECEIVE (WM_APP + 400)
extern HINSTANCE hInstance;
class CSerialCtr
{
private:
HWND Handle;//窗口句柄;
public:
typedef enum
{
EEventNone = -1, // Event trigged without cause
EEventBreak = EV_BREAK, // A break was detected on input
EEventCTS = EV_CTS, // The CTS signal changed state
EEventDSR = EV_DSR, // The DSR signal changed state
EEventError = EV_ERR, // A line-status error occurred
EEventRing = EV_RING, // A ring indicator was detected
EEventRLSD = EV_RLSD, // The RLSD signal changed state
EEventRecv = EV_RXCHAR, // Data is received on input
EEventRcvEv = EV_RXFLAG, // Event character was received on input
EEventSend = EV_TXEMPTY, // Last character on output was sent
}
EEvent;

// Baudrate
typedef enum
{
EBaudUnknown = -1, // Unknown
EBaud110 = CBR_110, // 110 bits/sec
EBaud300 = CBR_300, // 300 bits/sec
EBaud600 = CBR_600, // 600 bits/sec
EBaud1200 = CBR_1200, // 1200 bits/sec
EBaud2400 = CBR_2400, // 2400 bits/sec
EBaud4800 = CBR_4800, // 4800 bits/sec
EBaud9600 = CBR_9600, // 9600 bits/sec
EBaud14400 = CBR_14400, // 14400 bits/sec
EBaud19200 = CBR_19200, // 19200 bits/sec (default)
EBaud38400 = CBR_38400, // 38400 bits/sec
EBaud56000 = CBR_56000, // 56000 bits/sec
EBaud57600 = CBR_57600, // 57600 bits/sec
EBaud115200 = CBR_115200, // 115200 bits/sec
EBaud128000 = CBR_128000, // 128000 bits/sec
EBaud256000 = CBR_256000, // 256000 bits/sec
}
EBaudrate;

// Data bits (5-8)
typedef enum
{
EDataUnknown = -1, // Unknown
EData5 = 5, // 5 bits per byte
EData6 = 6, // 6 bits per byte
EData7 = 7, // 7 bits per byte
EData8 = 8 // 8 bits per byte (default)
}
EDataBits;

// Parity scheme
typedef enum
{
EParUnknown = -1, // Unknown
EParNone = NOPARITY, // No parity (default)
EParOdd = ODDPARITY, // Odd parity
EParEven = EVENPARITY, // Even parity
EParMark = MARKPARITY, // Mark parity
EParSpace = SPACEPARITY // Space parity
}
EParity;

// Stop bits
typedef enum
{
EStopUnknown = -1, // Unknown
EStop1 = ONESTOPBIT, // 1 stopbit (default)
EStop1_5 = ONE5STOPBITS,// 1.5 stopbit
EStop2 = TWOSTOPBITS // 2 stopbits
}
EStopBits;

// Handshaking
typedef enum
{
EHandshakeUnknown = -1, // Unknown
EHandshakeOff = 0, // No handshaking
EHandshakeHardware = 1, // Hardware handshaking (RTS/CTS)
EHandshakeSoftware = 2 // Software handshaking (XON/XOFF)
}
EHandshake;

// Timeout settings
typedef enum
{
EReadTimeoutUnknown = -1, // Unknown
EReadTimeoutNonblocking = 0, // Always return immediately
EReadTimeoutBlocking = 1 // Block until everything is retrieved
}
EReadTimeout;

// Communication errors
typedef enum
{
EErrorUnknown = 0, // Unknown
EErrorBreak = CE_BREAK, // Break condition detected
EErrorFrame = CE_FRAME, // Framing error
EErrorIOE = CE_IOE, // I/O device error
EErrorMode = CE_MODE, // Unsupported mode
EErrorOverrun = CE_OVERRUN, // Character buffer overrun, next byte is lost
EErrorRxOver = CE_RXOVER, // Input buffer overflow, byte lost
EErrorParity = CE_RXPARITY,// Input parity error
EErrorTxFull = CE_TXFULL // Output buffer full
}
EError;

// Port availability
typedef enum
{
EPortUnknownError = -1, // Unknown error occurred
EPortAvailable = 0, // Port is available
EPortNotAvailable = 1, // Port is not present
EPortInUse = 2 // Port is in use

}
EPort;
public:
CSerialCtr();
virtual ~CSerialCtr();
public:

EPort CheckPort (LPCTSTR lpszDevice);
virtual LONG Open (LPCTSTR lpszDevice, DWORD dwInQueue = 2048, DWORD dwOutQueue = 2048);
virtual LONG Close (void);
virtual LONG Setup (EBaudrate eBaudrate = EBaud9600,
EDataBits eDataBits = EData8,
EParity eParity = EParNone,
EStopBits eStopBits = EStop1);
virtual LONG SetEventChar (BYTE bEventChar, bool fAdjustMask = true);
virtual LONG SetMask (DWORD dwMask = EEventBreak|EEventError|EEventRecv);
virtual LONG WaitEvent (LPOVERLAPPED lpOverlapped = 0, DWORD dwTimeout = INFINITE);
virtual LONG SetupHandshaking (EHandshake eHandshake);
virtual LONG SetupReadTimeouts (EReadTimeout eReadTimeout);
virtual EBaudrate GetBaudrate (void);
virtual EDataBits GetDataBits (void);
virtual EParity GetParity (void);
virtual EStopBits GetStopBits (void);
virtual EHandshake GetHandshaking (void);
virtual DWORD GetEventMask (void);
virtual BYTE GetEventChar (void);
virtual LONG Write (const void* pData, size_t iLen, DWORD* pdwWritten = 0, LPOVERLAPPED lpOverlapped = 0, DWORD dwTimeout = INFINITE);
virtual LONG Write (LPCSTR pString, DWORD* pdwWritten = 0, LPOVERLAPPED lpOverlapped = 0, DWORD dwTimeout = INFINITE);
virtual LONG Read (void* pData, size_t iLen, DWORD* pdwRead = 0, LPOVERLAPPED lpOverlapped = 0, DWORD dwTimeout = INFINITE);
EEvent GetEventType (void);
EError GetError (void);
HANDLE GetCommHandle (void) { return m_hFile; }

// Check if com-port is opened
bool IsOpen (void) const { return (m_hFile != 0); }

// Obtain last error status
LONG GetLastError (void) const { return m_lLastError; }

// Obtain CTS/DSR/RING/RLSD settings
bool GetCTS (void);
bool GetDSR (void);
bool GetRing (void);
bool GetRLSD (void);
void SetTarget(HANDLE h);
// Flush all buffers
LONG Flush (void);
int __stdcall OnTimer();
protected:
// Internal helper class which wraps DCB structure
class CDCB : public DCB
{
public:
CDCB() { DCBlength = sizeof(DCB); }
};
static LRESULT __stdcall WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);//窗口过程.
// Attributes
protected:
LONG m_lLastError; // Last serial error
HANDLE m_hFile; // File handle
EEvent m_eEvent; // Event type
HANDLE m_hevtOverlapped; // Event handle for internal overlapped operations
HANDLE m_hTarget;
};

#endif // __SERIAL_H


hatumei 2003-10-16
  • 打赏
  • 举报
回复
没看到TR@SOE()已经来了, TR了解的更全面,
hatumei 2003-10-16
  • 打赏
  • 举报
回复
据说条码阅读器读数据就如同键盘输入一样,它发送数据后,就发送一个回车事件。只要是可视的并且可录入的窗口,都可以接收数据。因此你只要创建一个界面,把输入的地方设为焦点,并支持回车换行就可以采集数据了。你可以试一试。以前有过这样的贴子,你搜索一下。
TR@SOE 2003-10-16
  • 打赏
  • 举报
回复
不很清楚你的要求。如果只是有了条码阅读器,要在程序中读出内容,那么要看条码器的的接口形式。

如果是KEYBOARD WEDGE,那么和从键盘输入是没有区别的;如果是串口,也可以直接读串口的信息。
cfchhx 2003-10-16
  • 打赏
  • 举报
回复
To(明月):真是好人哪。
Kabin 2003-10-16
  • 打赏
  • 举报
回复


好长,头晕
hatumei 2003-10-16
  • 打赏
  • 举报
回复
原以为一个贴子能够发了,没想到CSDN有这么多限制,我还是不发了吧
hatumei 2003-10-16
  • 打赏
  • 举报
回复
我发了3次就无法发了,下面继续:
//serial.cpp
#include "Serial.h"
#define READ_BLOCK_LEN 16
CSerialCtr::CSerialCtr ()
{
// Reset data
m_lLastError = ERROR_SUCCESS;
m_hFile = 0;
m_eEvent = EEventNone;
m_hevtOverlapped = 0;

static TCHAR szApp[]=TEXT("SerialCtr");
WNDCLASS wc;

wc.style=CS_HREDRAW|CS_VREDRAW;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.lpfnWndProc=WndProc;
wc.hInstance=hInstance;
wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=CreateSolidBrush(0);
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName=NULL;
wc.lpszClassName=szApp;
wc.lpfnWndProc=&CSerialCtr::WndProc;

if(!RegisterClass(&wc))
{
MessageBox(NULL,TEXT("NT"),szApp,MB_ICONERROR);
return;
}

Handle = CreateWindowEx(WS_EX_TOOLWINDOW,
wc.lpszClassName,
wc.lpszClassName,
WS_EX_OVERLAPPEDWINDOW,
0,
0,
0,
0,
0,
0,
hInstance,
LPVOID(this));

ShowWindow(Handle,SW_HIDE);
UpdateWindow(Handle);

}

CSerialCtr::~CSerialCtr ()
{
if (m_hFile)
{
Close();
}
if (Handle!=NULL)
DestroyWindow(Handle);
}
LRESULT __stdcall CSerialCtr::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_CREATE:
{
CSerialCtr * ThisPtr = (CSerialCtr *)((LPCREATESTRUCT(lParam)) ->lpCreateParams);
SetProp(hWnd, "THISPOINTER", HANDLE(ThisPtr));
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
case WM_TIMER:
{
CSerialCtr * ThisPtr = (CSerialCtr*) GetProp(hWnd,"THISPOINTER");
if (ThisPtr!=NULL)
ThisPtr->OnTimer();
return TRUE;
}
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
}

CSerialCtr::EPort CSerialCtr::CheckPort (LPCTSTR lpszDevice)
{
// Try to open the device
HANDLE hFile = ::CreateFile(lpszDevice,
GENERIC_READ|GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
0);

// Check if we could open the device
if (hFile == INVALID_HANDLE_VALUE)
{
// Display error
switch (::GetLastError())
{
case ERROR_FILE_NOT_FOUND:
// The specified COM-port does not exist
return EPortNotAvailable;

case ERROR_ACCESS_DENIED:
// The specified COM-port is in use
return EPortInUse;

default:
// Something else is wrong
return EPortUnknownError;
}
}

// Close handle
::CloseHandle(hFile);

// Port is available
return EPortAvailable;
}

LONG CSerialCtr::Open (LPCTSTR lpszDevice, DWORD dwInQueue, DWORD dwOutQueue)
{
// Reset error state
m_lLastError = ERROR_SUCCESS;
// Check if the port isn't already opened
if (m_hFile)
{
m_lLastError = ERROR_ALREADY_INITIALIZED;
return m_lLastError;
}

// Open the device
m_hFile = ::CreateFile(lpszDevice,
GENERIC_READ|GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
0);
if (m_hFile == INVALID_HANDLE_VALUE)
{
// Reset file handle
m_hFile = 0;

// Display error
m_lLastError = ::GetLastError();
return m_lLastError;
}

// Create the event handle for internal overlapped operations (manual reset)
m_hevtOverlapped = ::CreateEvent(0,true,false,0);
if (m_hevtOverlapped == 0)
{
// Obtain the error information
m_lLastError = ::GetLastError();
// Close the port
::CloseHandle(m_hFile);
m_hFile = 0;

// Return the error
return m_lLastError;
}

// Setup the COM-port
if (!::SetupComm(m_hFile,dwInQueue,dwOutQueue))
{
// Display a warning
long lLastError = ::GetLastError();
// Close the port
Close();
// Save last error from SetupComm
m_lLastError = lLastError;
return m_lLastError;
}

// Setup the default communication mask
SetMask();

// Setup the device for default settings
Setup();

// Non-blocking reads is default
SetupReadTimeouts(EReadTimeoutNonblocking);

// Default is no handshaking
SetupHandshaking(EHandshakeOff);

///////////////////////////// Set Timer For Receiving ////////////////////
SetTimer(Handle,0,1000, NULL);
// Return successful
return m_lLastError;
}

LONG CSerialCtr::Close (void)
{
// Reset error state
m_lLastError = ERROR_SUCCESS;

// If the device is already closed,
// then we don't need to do anything.
if (m_hFile == 0)
{
return m_lLastError;
}

// Free event handle
::CloseHandle(m_hevtOverlapped);
m_hevtOverlapped = 0;

// Close COM port
::CloseHandle(m_hFile);
m_hFile = 0;

// Return successful
//KillTimer(NULL,88);
return m_lLastError;
}
swites 2003-10-16
  • 打赏
  • 举报
回复
ok
yesry 2003-10-16
  • 打赏
  • 举报
回复
gz

1,178

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 数据库及相关技术
社区管理员
  • 数据库及相关技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧