BCD码问题?

lashengcrh 2003-07-08 10:17:06
在下在做串口通讯时,往串口中写BCD码。
希望各位大侠给我讲一讲原理,并加一些实现ASCII<=>BCD的转换代码。
或者指出那里有相关内容也行。
分数相送。
...全文
166 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
lashengcrh 2003-07-10
  • 打赏
  • 举报
回复
UP
DoubleJiang 2003-07-09
  • 打赏
  • 举报
回复
用异步串口操作
*/
BOOL CComm::OpenComm( void )
{
m_hComm = CreateFile( szCommName,
GENERIC_READ | GENERIC_WRITE,
0, //share mode: no share
NULL, //securiy attributes
OPEN_EXISTING, //Open disposition
FILE_FLAG_OVERLAPPED,
NULL);
if( INVALID_HANDLE_VALUE == m_hComm )
{
AfxMessageBox( "打开串口错误, [OpenComm--CreateFile]函数", MB_OK, MB_ICONSTOP );
return FALSE;
}

SetCommMask( m_hComm, EV_RXCHAR | EV_TXEMPTY );
SetupComm( m_hComm, 1024, 512 );
PurgeComm( m_hComm, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR );

COMMTIMEOUTS CommTimeOuts;
CommTimeOuts.ReadIntervalTimeout = 5; //5 seconds
CommTimeOuts.WriteTotalTimeoutMultiplier = 100;
SetCommTimeouts( m_hComm, &CommTimeOuts );

//LPCOMMCONFIG lpCC = m_dlgComSet.GetCC();
DCB dcb;

GetCommState( m_hComm, &dcb );
dcb.BaudRate = m_cc.dcb.BaudRate;
dcb.ByteSize = m_cc.dcb.ByteSize;
dcb.fBinary = TRUE;
dcb.fParity = m_cc.dcb.fParity;

if( !SetCommState( m_hComm, &dcb ) )
{
AfxMessageBox( "打开串口错误, [OpenComm--SetCommState]函数" );
return FALSE;
}
m_bCommOpen = TRUE;

DWORD dwThreadID;
m_hCommThread = CreateThread( NULL, 0, ThreadProc, this, 0, &dwThreadID );
if( !m_hCommThread )
{
ShowError();
//AfxMessageBox( "打开串口错误, [OpenComm--CreateThread]函数" );
return FALSE;
}
return TRUE;
}

DWORD CComm::ThreadProc( LPVOID lpParam )
{
CComm *pThis = ( CComm * )lpParam;

DWORD dwEvents, dwBytesRead;

while( pThis->m_bCommOpen )
{
if( WaitCommEvent( pThis->m_hComm, &dwEvents, NULL ) )
{
if( dwEvents == EV_RXCHAR )
{
dwBytesRead = pThis->ReadCommBlock( pThis->m_byteBuffer, 1024 );
if(dwBytesRead)
{
ResetEvent( pThis->m_hEvBufferEmpty );
::PostMessage( pThis->m_MainWindow, UM_DATAARRIVAL, 0, dwBytesRead );
WaitForSingleObject( pThis->m_hEvBufferEmpty, INFINITE );
}
}
}
else
{
if( GetLastError() != 995 )
pThis->ShowError();
//AfxMessageBox( "后台线程错误, [GetLastError() != 995]", MB_OK, MB_ICONSTOP );
return 0;
}
}
return 1;
}
NewFree 2003-07-09
  • 打赏
  • 举报
回复
int ConvertBCD(int dnum)
{
int bcdval=0;
if( dnum>9999 || dnum < 0 ) return -1;
bcdval = ( ( (dnum/1000)*16+(dnum%1000)/100)*16+(dnum%100)/10 )*16 +dnum%10;
return bcdval;
}
spwnihao 2003-07-09
  • 打赏
  • 举报
回复
8421码也叫BCD码
例如:
十进制数48
BCD码表示:0100 1000
二进制表示:0011 0000
Semigod 2003-07-08
  • 打赏
  • 举报
回复
BCD码是针对数字的。 分两种:非压缩BCD和压缩BCD
非压缩BCD码,一个字节只存一个0-9的数字,存储方法是:
0 ==> 0x00
1 ==> 0x01
....
9 ==> 0x09

压缩BCD码,一个字节存两个0-9的数字,存储方法是:
00 ==> 0x00
01 ==> 0x01
11 ==> 0x11
....
99 ==> 0x99

四个二进制位为单位,保存十进制数

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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