天天微頭條丨用VC6.0實現上位機串口通信
串口是常用的計算機與外部串行設備之間的數據傳輸通道,由于串行通信方便易行,所以應用廣泛。我們可以利用Windows API 提供的通信函數編寫出高可移植性的串行通信程序。本實例介紹在Visual C++6.0下如何利用Win32 API 實現串行通信程序。程序編譯運行后的界面效果如圖一所示:
一、實現方法在Win16中,可以利用OpenComm()、CloseComm()和WriteComm()等函數打開、關閉和讀寫串口。但在Win32中,串口和其他通信設備均被作為文件處理,串口的打開、關閉和讀寫等操作所用的API函數與操作文件的函數相同??赏ㄟ^CreateFile()函數打開串口;通過CloseFile()函數關閉串口;通過DCB結構、CommProp()、GetCommProperties()、SetCommProperties()、GetCommState()及SetCommState()等函數設置串口狀態,通過函數ReadFile()和WritFile()等函數讀寫串口。下面來詳細介紹其實現原理。
對于串行通信設備,Win32 API支持同步和異步兩種I/O操作。同步操作方式的程序設計相對比較簡單,但I/O操作函數在I/O操作結束前不能返回,這將掛起調用線程,直到I/O操作結束。異步操作方式相對要復雜一些,但它可讓耗時的I/O操作在后臺進行,不會掛起調用線程,這在大數據量通信的情況下對改善調用線程的響應速度是相當有效的。異步操作方式特別適合同時對多個串行設備進行I/O操作和同時對一個串行設備進行讀/寫操作。
【資料圖】
串行設備的初始化
串行設備的初始化是利用CreateFile()函數實現的。該函數獲得串行設備句柄并對其進行通信參數設置,包括設置輸出/接收緩沖區大小、超時控制和事件監視等。 例如下面的代碼實現了串口的初始化:
//串行設備句柄; HANDLE hComDev=0; //串口打開標志; BOOL bOpen=FALSE; //線程同步事件句柄; HANDLE hEvent=0; DCB dcb; COMMTIMEOUTS timeouts; //設備已打開 if(bOpen) return FALSE; //打開COM1 if((hComDev=CreateFile(“COM1”,GENERICREAD|GENERICWRITE,0,NULL,OPENEXISTING,FILEATTRIBUTENORMAL,NULL))==INVALIDHANDLEVALUE)
return FALSE; //設置超時控制 SetCommTimeouts(hComDev,&timeouts); //設置接收緩沖區和輸出緩沖區的大小 SetupComm(hComDev,1024,512); //獲取缺省的DCB結構的值 GetCommState(hComDev,&dcb); //設定波特率為9600 bps dcb.BaudRate=CBR9600; //設定無奇偶校驗 dcb.fParity=NOPARITY; //設定數據位為8 dcb.ByteSize=8; //設定一個停止位 dcb.StopBits=ONESTOPBIT; //監視串口的錯誤和接收到字符兩種事件 SetCommMask(hComDev,EVERR|EVRXCHAR); //設置串行設備控制參數 SetCommState(hComDev,&dcb); //設備已打開 bOpen=TRUE; //創建人工重設、未發信號的事件 hEvent=CreateEvent(NULL,FALSE,FALSE, “WatchEvent”); //創建一個事件監視線程來監視串口事件 AfxBeginThread(CommWatchProc,pParam); }
在設置串口DCB結構的參數時,不必設置每一個值。首先讀出DCB缺省的參數設置,然后只修改必要的參數,其他參數都取缺省值。由于對串口進行的是同步I/O操作,所以除非指定進行監測的事件發生,否則WaitCommEvent()函數不會返回。在串行設備初始化的最后要建立一個單獨的監視線程來監視串口事件,以免掛起當前調用線程,其中pParam可以是一個對事件進行處理的窗口類指針。
如果要進行異步I/O操作,打開設備句柄時,CreateFile的第6個參數應增加FILEFLAGOVERLAPPED 標志。
數據發送
數據發送利用WriteFile()函數實現。對于同步I/O操作,它的最后一個參數可為NULL;而對異步I/O操作,它的最后一個參數必需是一個指向OVERLAPPED結構的指針,通過OVERLAPPED結構來獲得當前的操作狀態。
BOOL WriteComm(LPCVOID lpSndBuffer,DWORD dwBytesToWrite) { //lpSndBuffer為發送數據緩沖區指針, dwBytesToWrite為將要發送的字節長度 //設備已打開 BOOL bWriteState; //實際發送的字節數 DWORD dwBytesWritten; //設備未打開 if(!bOpen) return FALSE; bWriteState=WriteFile(hComDev,lpSndBuffer,dwBytesToWrite,&dwBytesWritten,NULL); if(!bWriteState || dwBytesToWrite!=dwBytesWritten)
//發送失敗
return FALSE; else
//發送成功
return TRUE; }
數據接收
接收數據的任務由ReadFile函數完成。該函數從串口接收緩沖區中讀取數據,讀取數據前,先用ClearCommError函數獲得接收緩沖區中的字節數。接收數據時,同步和異步讀取的差別同發送數據是一樣的。
DWORD ReadComm(LPVOID lpInBuffer,DWORD dwBytesToRead) { //lpInBuffer為接收數據的緩沖區指針, dwBytesToRead為準備讀取的數據長度(字節數) //串行設備狀態結構 COMSTAT ComStat; DWORD dwBytesRead,dwErrorFlags; //設備未打開 if(!bOpen) return 0; //讀取串行設備的當前狀態 ClearCommError(hComDev,&dwErrorFlags,&ComStat); //應該讀取的數據長度 dwBytesRead=min(dwBytesToRead,ComStat.cbInQue); if(dwBytesRead>0)
//讀取數據
if(!ReadFile(hComDev,lpInBuffer,dwBytesRead,&dwBytesRead,NULL))
dwBytesRead=0; return dwBytesRead; }
事件監視線程
事件監視線程對串口事件進行監視,當監視的事件發生時,監視線程可將這個事件發送(SendMessage)或登記(PostMessage)到對事件進行處理的窗口類(由pParam指定)中。
UINT CommWatchProc(LPVOID pParam) { DWORD dwEventMask=0; //發生的事件; while(bOpen) {
//等待監視的事件發生
WaitCommEvent(hComDev, &dwEventMask,NULL);
if ((dwEventMask & EVRXCHAR)==EVRXCHAR)
……//接收到字符事件后,可以將此消息登記到由pParam有指定的窗口類中進行處理
if(dwEventMask & EVERR)==EVERROR)
……//發生錯誤時的處理 } SetEvent(hEvent); //發信號,指示監視線程結束 return 0; }
關閉串行設備
在整個應用程序結束或不再使用串行設備時,應將串行設備關閉,包括取消事件監視,將設備打開標志bOpen置為FALSE以使事件監視線程結束,清除發送/接收緩沖區和關閉設備句柄。
void CloseSynComm() { if(!bOpen) return; //結束事件監視線程 bOpen=FALSE; SetCommMask(hComDev,0); //取消事件監視,此時監視線程中的WaitCommEvent將返回 WaitForSingleObject(hEvent,INFINITE); //等待監視線程結束 CloseHandle(hEvent); //關閉事件句柄 //停止發送和接收數據,并清除發送和接收緩沖區 PurgeComm(hComDev,PURGETXABORT| PURGERXABORT|PURGETXCLEAR|PURGERXCLEAR); //關閉設備句柄 CloseHandle(hComDev); }
二、編程步驟1、 啟動Visual C++6.0,生成一個基于對話框的的應用程序,將該程序命名為“SerealCom”;
2、 按照圖一的界面設計對話框,具體設置參見代碼部分;
3、 使用Class Wizard為對話框的按鈕添加鼠標單擊消息響應函數;
4、 添加代碼,編譯運行程序。
1 #if !defined(_COMM_ACCESS_FUNCTIONS_AND_DATA) 2 #define _COMM_ACCESS_FUNCTIONS_AND_DATA 3 #if _MSC_VER > 1000 4 #pragma once 5 #endif // _MSC_VER > 1000 6 #define EVENTCHAR 0x0d 7 #define MAXBLOCKLENGTH 59 8 9 extern BYTE XwCom; 10 extern BYTE sCom1[5],sCom2[MAXBLOCKLENGTH+12]; 11 extern sCom3[MAXBLOCKLENGTH+12]; 12 extern BYTE opation; 13 extern short ComNum; 14 15 #define FC_DTRDSR 0x01 16 #define FC_RTSCTS 0x02 17 #define FC_XONXOFF 0x04 18 #define ASCII_BEL 0x07 19 #define ASCII_BS 0x08 20 #define ASCII_LF 0x0A 21 #define ASCII_CR 0x0D 22 #define ASCII_XON 0x11 23 #define ASCII_XOFF 0x13 24 25 class CComStatus 26 { 27 public: 28
HANDLE m_hCom; 29
BYTE m_bComId; 30
BYTE m_bByteSize; 31
BYTE m_bStopBits; 32
BYTE m_bParity; 33
DWORD m_dwBaudRate; 34 35
//WORD m_fChEvt; 36 37
char m_bEvtChar; 38
DWORD m_fBinary; 39
BOOL m_bConnected; 40
BOOL m_fXonXoff; 41
BOOL m_bFlowCtrl; 42
OVERLAPPED m_rdos; 43
OVERLAPPED m_wtos; 44 45
//functions 46 47
CComStatus(); 48
CComStatus(BYTE bComId,BYTE bByteSize,BYTE bStopBits,BYTE bParity, 49
DWORD dwBaudRate,/*WORD fChEvt,*/char bEvtChar,DWORD fBinary); 50
BOOL OpenConnection(); 51
BOOL CloseConnection(); 52
BOOL SetupConnection(); 53
BOOL IsConnected(); 54 }; 55 56 UINT CommWatchProc( LPVOID lpData ); 57 BOOL WriteCommBlock( CComStatus& comDev, LPSTR lpByte , DWORD dwBytesToWrite); 58 int ReadCommBlock(CComStatus& comDev,LPSTR lpszBlock, int nMaxLength ); 59 int ReadCommBlockEx(CComStatus& comDev,LPSTR lpszBlock, int nMaxLength,DWORD dwTimeOut); 60 #endif 61 62 /// 63 64 #include "stdafx.h" 65 #include "com232.h" 66 67 BYTE XwCom=0x40; 68 BYTE sCom1[5],sCom2[MAXBLOCKLENGTH+12],sCom3[MAXBLOCKLENGTH+12]; 69 BYTE opation; 70 short ComNum; 71 CComStatus::CComStatus() 72 { 73 m_hCom = NULL; 74 m_bComId = (char)ComNum;//COM1 75 m_bByteSize=8; 76 m_bStopBits=ONESTOPBIT; 77 m_bParity=NOPARITY; 78 m_dwBaudRate=9600; 79 m_bEvtChar=EVENTCHAR; 80 m_fBinary=1; 81 m_bConnected = FALSE; 82 m_bFlowCtrl = FC_XONXOFF ; 83 m_fXonXoff = FALSE; 84 } 85 86 CComStatus::CComStatus(BYTE bComId,BYTE bByteSize,BYTE bStopBits,BYTE bParity,DWORD dwBaudRate,/*WORD fChEvt,*/char bEvtChar,DWORD fBinary) 87 { 88 m_hCom = NULL; 89 m_bComId = bComId; 90 m_bByteSize=bByteSize; 91 m_bStopBits=bStopBits; 92 m_bParity=bParity; 93 m_dwBaudRate=dwBaudRate; 94 m_bEvtChar=bEvtChar; 95 m_fBinary=fBinary; 96 m_bConnected = FALSE; 97 m_bFlowCtrl = FC_XONXOFF ; 98 m_fXonXoff = FALSE; 99 }100 101 BOOL CComStatus::OpenConnection()102 {103 char csCom[10];104 COMMTIMEOUTS CommTimeOuts ;105 if((m_bComId < 0) || (m_bComId > 4))106
return FALSE;//從COM1到COM4107 if(m_hCom)//if already open108 return FALSE;109 110 //OVERLAPPED包含異步I/O信息111 112 m_rdos.Offset = 0;113 m_rdos.OffsetHigh = 0;114 m_rdos.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);115 if(m_rdos.hEvent == NULL)116
return FALSE;117 m_wtos.Offset = 0;118 m_wtos.OffsetHigh = 0;119 m_wtos.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);120 if(m_wtos.hEvent == NULL)121 {122
CloseHandle(m_rdos.hEvent);123
return FALSE;124 }125 126 wsprintf(csCom,"COM%d",m_bComId);127 128 m_hCom = CreateFile(csCom,GENERIC_READ | GENERIC_WRITE, 0,NULL, OPEN_EXISTING,ILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,NULL);129 130 if(m_hCom == INVALID_HANDLE_VALUE) {131
//dwError = GetLastError();132
// handle error 133
return FALSE;134 }135 else136 {137
SetCommMask( m_hCom, EV_RXCHAR ) ; // get any early notifications138
SetupComm( m_hCom, 4096, 4096 ) ; // setup device buffers139
// purge any information in the buffer140 141
PurgeComm( m_hCom, PURGE_TXABORT | PURGE_RXABORT |PURGE_TXCLEAR | PURGE_RXCLEAR ) ;142 143
// set up for overlapped I/O144 145
DWORD dwTemp = 1000 / (this->m_dwBaudRate / 8);146
CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF ;147
CommTimeOuts.ReadTotalTimeoutMultiplier = 0;//((dwTemp > 0) ? dwTemp : 1);148
CommTimeOuts.ReadTotalTimeoutConstant = 1000 ;149 150
// CBR_9600 is approximately 1byte/ms. For our purposes, allow151
// double the expected time per character for a fudge factor.152 153
CommTimeOuts.WriteTotalTimeoutMultiplier =2*CBR_9600/this->m_dwBaudRate;//( npTTYInfo ) ;154
CommTimeOuts.WriteTotalTimeoutConstant = 0;//1000 ;155 156
SetCommTimeouts( m_hCom, &CommTimeOuts ) ;157 }158 if(!SetupConnection())159 {160
CloseConnection();161
return FALSE;162 }163 EscapeCommFunction( m_hCom, SETDTR );164 m_bConnected = TRUE;165 return TRUE;166 }167 168 BOOL CComStatus::CloseConnection()169 {170 if (NULL == m_hCom)171
return ( TRUE ) ;172 // set connected flag to FALSE173 m_bConnected = FALSE;174 // disable event notification and wait for thread175 // to halt176 SetCommMask( m_hCom, 0 ) ;177 EscapeCommFunction( m_hCom, CLRDTR ) ;178 // purge any outstanding reads/writes and close device handle179 PurgeComm( m_hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR ) ;180 CloseHandle( m_hCom ) ;181 m_hCom = NULL;182 183 // change the selectable items in the menu184 185 CloseHandle(m_rdos.hEvent);186 CloseHandle(m_wtos.hEvent);187 return ( TRUE ) ;188 }189 190 BOOL CComStatus::SetupConnection()191 {192 BOOL fRetVal ;193 BYTE bSet ;194 DCB dcb ;195 if(m_hCom == NULL)196
return FALSE; 197 dcb.DCBlength = sizeof( DCB ) ;198 GetCommState( m_hCom, & dcb ) ;199 dcb.BaudRate = this->m_dwBaudRate;200 dcb.ByteSize = this->m_bByteSize;201 dcb.Parity = this->m_bParity;202 dcb.StopBits = this->m_bStopBits ;203 dcb.EvtChar = this->m_bEvtChar ;204 // setup hardware flow control205 bSet = (BYTE) ((m_bFlowCtrl & FC_DTRDSR) != 0) ;206 dcb.fOutxDsrFlow = bSet ;207 if (bSet)208
dcb.fDtrControl = DTR_CONTROL_HANDSHAKE ;209 else210
dcb.fDtrControl = DTR_CONTROL_ENABLE ;211 bSet = (BYTE) ((m_bFlowCtrl & FC_RTSCTS) != 0) ;212 dcb.fOutxCtsFlow = bSet ;213 if (bSet)214
dcb.fRtsControl = RTS_CONTROL_HANDSHAKE ;215 else216
dcb.fRtsControl = RTS_CONTROL_ENABLE ;217 // setup software flow control218 bSet = (BYTE) ((m_bFlowCtrl & FC_XONXOFF) != 0) ;219 dcb.fInX = dcb.fOutX = bSet ;220 dcb.XonChar = ASCII_XON ;221 char xon = ASCII_XON ;222 dcb.XoffChar = ASCII_XOFF ;223 char xoff = ASCII_XOFF ;224 dcb.XonLim = 100 ;225 dcb.XoffLim = 100 ;226 // other various settings227 dcb.fBinary = TRUE ;228 dcb.fParity = TRUE ;229 fRetVal = SetCommState( m_hCom, &dcb ) ;230 return ( fRetVal ) ;231 } // end of SetupConnection()232 233 BOOL CComStatus::IsConnected()234 {235 return m_bConnected;236 }237 238 UINT CommWatchProc( LPVOID lpData )239 {240 DWORD dwEvtMask ;241 //NPTTYINFO npTTYInfo = (NPTTYINFO) lpData ;242 OVERLAPPED os ;243 int nLength ;244 //BYTE abIn[ MAXBLOCK + 1] ;245 246 CComStatus * pCom = (CComStatus *)lpData;247 memset( &os, 0, sizeof( OVERLAPPED ) ) ;248 // create I/O event used for overlapped read249 250 os.hEvent = CreateEvent( NULL, // no security251
TRUE, // explicit reset req252
FALSE, // initial event reset253
NULL ) ; // no name254 255 if (os.hEvent == NULL)256 {257
MessageBox( NULL, "Failed to create event for thread!", "TTY Error!",MB_ICONEXCLAMATION | MB_OK ) ;258
return ( FALSE ) ;259 }260 if (!SetCommMask( pCom->m_hCom, EV_RXCHAR ))261
return ( FALSE ) ;262 char buf[256];263 while ( pCom->m_bConnected )264 {265
dwEvtMask = 0 ;266
WaitCommEvent( pCom->m_hCom, &dwEvtMask, NULL );267
if ((dwEvtMask & EV_RXCHAR) == EV_RXCHAR)268
{269
if ((nLength = ReadCommBlock( *pCom, (LPSTR) buf, 255 )))270
{271
//WriteTTYBlock( hTTYWnd, (LPSTR) abIn, nLength ) ;272
buf[nLength]="\0";273
AfxMessageBox(buf);274
}275
}276 }277 CloseHandle( os.hEvent ) ;278 return( TRUE ) ;279 } // end of CommWatchProc()280 281 int ReadCommBlock(CComStatus& comDev,LPSTR lpszBlock, int nMaxLength )282 {283 BOOL fReadStat ;284 COMSTAT ComStat ;285 DWORD dwErrorFlags;286 DWORD dwLength;287 DWORD dwError;288 289 char szError[ 10 ] ;290 291 // only try to read number of bytes in queue292 293 ClearCommError( comDev.m_hCom, &dwErrorFlags, &ComStat ) ;294 dwLength = min( (DWORD) nMaxLength, ComStat.cbInQue ) ;295 296 if (dwLength > 0)297 {298
fReadStat = ReadFile( comDev.m_hCom, lpszBlock,dwLength, &dwLength, & (comDev.m_rdos) ) ;299
if (!fReadStat)300
{301
if (GetLastError() == ERROR_IO_PENDING)302
{303
OutputDebugString("\n\rIO Pending");304
while(!GetOverlappedResult( comDev.m_hCom ,&(comDev.m_rdos), & dwLength, TRUE ))305
{306
dwError = GetLastError();307
if(dwError == ERROR_IO_INCOMPLETE)308
// normal result if not finished309
continue;310
else311
{312
// an error occurred, try to recover313
wsprintf( szError, "", dwError ) ;314
ClearCommError( comDev.m_hCom , &dwErrorFlags, &ComStat ) ;315
break;316
}317
}318
}319
else320
{321
// some other error occurred322
dwLength = 0 ;323
ClearCommError( comDev.m_hCom , &dwErrorFlags, &ComStat ) ;324
}325
}326 }327 return ( dwLength ) ;328 } // end of ReadCommBlock()329 330 int ReadCommBlockEx(CComStatus& comDev,LPSTR lpszBlock, int nMaxLength,DWORD dwTimeOut)331 {332 LPSTR lpOffset=lpszBlock;333 int nReadCount = 0;334 char chBuf;335 //time_t beginTime,endTime;336 if(!comDev.m_hCom)337
return 0;338 if(dwTimeOut <= 0)339
return 0;340 MSG msg;341 //time(&beginTime);342 DWORD dwLastTick,dwNowTick,dwGoneTime;343 dwGoneTime = 0;344 dwLastTick = GetTickCount();345 dwNowTick = dwLastTick;346 // double diftime;347 do348 {349
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))350
{351
::TranslateMessage(&msg);352
::DispatchMessage(&msg);353
}354
if(ReadCommBlock(comDev,&chBuf,1) > 0)355
{356
//TRACE("----get a char----\n");357
*lpOffset = chBuf;358
lpOffset ++;359
nReadCount ++;360
}361
dwNowTick = GetTickCount();362
if(dwNowTick < dwLastTick)363
{364
dwLastTick = dwNowTick;365
}366 367
dwGoneTime = dwNowTick - dwLastTick;368 369
//TRACE("gon time = %lu\n",dwGoneTime);370 371 }while((nReadCount < nMaxLength) && (dwGoneTime < dwTimeOut));372 return (nReadCount);373 }//end ReadCommBlockEx374 375 BOOL WriteCommBlock( CComStatus& comDev, LPSTR lpByte , DWORD dwBytesToWrite)376 {377 BOOL fWriteStat ;378 DWORD dwBytesWritten ;379 DWORD dwErrorFlags;380 DWORD dwError;381 DWORD dwBytesSent=0;382 COMSTAT ComStat;383 384 char szError[ 128 ] ;385 386 fWriteStat = WriteFile( comDev.m_hCom , lpByte, dwBytesToWrite,&dwBytesWritten, &( comDev.m_wtos) ) ;387 if (!fWriteStat)388 {389
if(GetLastError() == ERROR_IO_PENDING)390
{391
while(!GetOverlappedResult( comDev.m_hCom,&(comDev.m_wtos), & dwBytesWritten, TRUE ))392
{393
dwError = GetLastError();394
if(dwError == ERROR_IO_INCOMPLETE)395
{396
// normal result if not finished397
dwBytesSent += dwBytesWritten;398
continue;399
}400
else401
{402
// an error occurred, try to recover403
wsprintf( szError, "", dwError ) ;404
ClearCommError( comDev.m_hCom, &dwErrorFlags, &ComStat ) ;405
break;406
}407
}408
dwBytesSent += dwBytesWritten;409
if( dwBytesSent != dwBytesToWrite )410
wsprintf(szError,"\nProbable Write Timeout: Total of %ld bytes sent", dwBytesSent);411
else412
wsprintf(szError,"\n%ld bytes written", dwBytesSent);413
OutputDebugString(szError);414
}415
else416
{417
// some other error occurred418
ClearCommError( comDev.m_hCom, &dwErrorFlags, &ComStat ) ;419
return ( FALSE );420
}421 }422 return ( TRUE ) ;423 } // end of WriteCommBlock()
四、小結 以上給出了用Win32 API設計串行通信的基本思路,在實際應用中,我們可以利用Win32 API設計出滿足各種需要的串行通信程序。
歡迎各位電子愛好者轉載。
PS原文出自http://soft.yesky.com/50/2214050_2.shtml
標簽:
相關推薦:
精彩放送:
- []每日快報!粘膠短纖維市場現狀是什么?粘膠短纖維的未來發展趨勢
- []數據結構試題有哪些?數據結構試題及評分解析
- []熱議:c語言餐桌游戲有哪些?教會你這十款酒桌游戲讓你在朋友圈穩站“C”位!
- []招行信用卡榮獲“2022年度金質信用卡天璣獎”
- []“快閃”成都,五糧濃香兔年生肖酒打響旺季攻勢、搶跑“春節檔”!
- []挑選運動耳機不踩雷!一篇文章告訴你想知道的所有
- []全球觀點:【東海期貨12月8日宏觀金融日報】:國內疫情防控措施進一步優化
- []中信建投期貨12月8日早間交易策略
- []視訊!蘇州高新發行3億元超短期融資券 利率2.48%
- []焦點信息:央行:支持房地產市場平穩健康發展 用好“保交樓”專項借款加大對房企貸款投放力度
- []鋒龍股份:公司首發募集資金和可轉債募集資金投資項目正按項目計劃在緊鑼密鼓地建設和籌備工作中
- []科恒股份:公司的主營業務為鋰電智能裝備及鋰離子正極材料,沒有涉足下游電芯制造
- []世界速看:普洛斯倉儲物流封閉式基礎設施公募REITs狀態更新為“已反饋”
- []世界熱文:ST愛迪爾:公司負債及現金流情況詳見公司最新定期報告
- []【熱聞】雅居樂集團與農行廣東分行簽約 后者在同等條件下優先為雅居樂提供必要綜合融資服務
- []廣州知識城攜北京華瑞錦泰以3.07億元競得廣州黃埔區一宗商地
- []駿成科技:此輪疫情對公司的生產以及業績影響不大,從公司公布的三季報數據可見
- []成人補鈣吃什么鈣片好?金丐醋酸鈣科學補鈣更輕松
- []環球今亮點!深圳峰匯創投發展擬轉讓長興中建投38.5%股權 底價1.62億元
- []重慶輪船集團掛牌宜賓天港物流40%股權及債權 轉讓底價為199萬元
- []僑銀股份新增投資霸州僑銀環??萍?持股比例100%
- []華發股份:公司已披露定增預案,具體內容詳見公司于12月6日上海證券交易所網站披露的公告
- []一起教育科技發布2022年三季度財報:業績穩中向好,連續四個季度實現盈利
- []全球觀天下!安徽滁州超29億元成交九宗地塊 總出讓面積848畝
- []長春3.86億元掛牌5宗地 總出讓面積37.28萬平米
- []當前快訊:珍寶島:公司的參股公司安徽九洲方圓制藥有限公司有飲片業務,據了解,目前業務規模營收億元左右
- []全球快消息!海航科技與天津信托和解
- []當前速訊:賣地發工資的邏輯
- []全球視訊!“三支箭”出弓地產度過“最難時光”?43只地產債大幅反彈近一月漲幅翻倍
- []互聯網巨頭也要跨界儲能?
- []當前消息!1000000000元!環保龍頭成立電池儲能公司
- []機會?蔚藍鋰芯電池生產線改造投產
- []全球時訊:3分鐘!電池儲能安全問題解決了?
- []什么是分布式儲能?分布式儲能系統有哪些功能?
- []環球報道:自費社保一年需交多少 社保自費一年得交多少錢
- []微資訊!從上海離職了怎么把公積金取出來,可分為三個步驟
- []天天滾動:青竹畫材科創板IPO進程終止:原計劃募資4億元,劉其通為控股股東
- []【全球新視野】中國電氣裝備集團12.84億元上海靜安拿地 將建總部大樓
- []當前報道:德國股市收低;截至收盤DAX 30下跌0.57%
- []每日消息!保險公司的分類
- []養老保險能退嗎
- []天天熱點!公積金綁定哪個銀行卡 公積金綁定的是哪個銀行卡
- []央行營業管理部:加大對房地產企業和建筑企業的貸款投放力度
- []環球快消息!一筆關聯交易 建發國際“低價”購入上海閔行兩宗地
- []朗進科技:公司未參與沙特的“The Line”未來城市項目
- []簡訊:中梁控股1月至11月合約銷售額620億元 銷售面積594萬平
- []朗進科技:12月6日公司高管張進、張永利減持公司股份合計1.2萬股
- []環球新消息丨數碼視訊:12月6日公司高管鄭海濤減持公司股份合計8萬股
- []世界今日訊!科華數據:12月6日公司高管林清民增持公司股份合計7300股
- []當前焦點!美瑞新材:12月6日公司高管任光雷減持公司股份合計10萬股
- []每日看點!容知日新5名股東合計減持201.64萬股 套現2.23億 2022年前三季度公司凈利4470.9萬
- []每日熱文:德信中國1-11月合約銷售金額約336億元
- []信息:海航投資將延期至12月21日前回復深交所半年報問詢函
- []【世界新視野】福州1-9月累計住房公積金提取72億 為23風險樓盤放款4.23億
- []【環球時快訊】光大地產至11月底接近4000套房屋全部提前交付
- []宣泰醫藥提示風險 熊去氧膽酸膠囊產品不涉及新冠病毒防治
- []世界短訊!道通科技:12月2日詹金勇減持公司股份合計8750股
- []今日聚焦!珀萊雅:12月6日公司高管方玉友減持公司股份合計24萬股
- []今日報丨ST宏達實控人被證監會擬罰1000萬元 律師明確可索賠區間
- []遠洋集團11月協議銷售額108.6億 前11月累計銷售895億元
- []財面兒|金地商置與金地集團續訂兩個服務協議 自明年1月1日起生效
- []快看點丨財面兒丨中國金茂1-11月累計取得簽約銷售金額共1374.8億元
- []每日頭條!粵水電:公司本次重組已取得中國證監會的核準批復,相關工作正在進行當中
- []每日動態!上坤地產:2022年前11個月合約銷售額約79.2億元
- []全球熱訊:財面兒|金地“21金地MTN007”將于12月15日償付利息6060萬元
- []旭輝控股集團前11月合同銷售1175.9億元
- []天天消息!二手房周報 | 15城成交再降8%,京蓉等皆不及年內周均(11.28-12.4)
- []韋爾股份:公司會一如既往的努力加強經營管理,努力做好經營,提升公司競爭力,實現穩定的業績增長回饋股東
- []今日播報!宜昌城發地產底價29.6億競得宜昌市伍家崗4宗地塊
- []香港11月底官方外匯儲備資產增加60億美元
- []全球微資訊!中天金融:公司逾期債務對應的擔保余額15.1億元
- []新華都:北京重力久致科技有限公司將在經營范圍內開展工作
- []武商集團:公司目前僅在南昌有酒店項目
- []天天熱消息:江蘇無錫支持“外擺位” 打造“夜市經濟”
- []快看:印度股市年均回報率接近20%,IT、材料、工業等行業回報率高
- []國際航協:全球航空業今年虧損收窄,明年將回歸盈利
- []頭條:龍光集團境內債整體展期獲得通過 累計展期規模超223億元
- []環球今頭條!上海中海物業因未履行二次供水水質檢測等被處罰6000元
- []環球焦點!沃森生物:公司在研新冠疫苗項目均在努力推進上市進程,公司將根據臨床進度和數據情況開展上市申報
- []全球快訊:英飛拓:公司暫未開展與卡塔爾世界杯足球賽相關業務
- []天天快資訊丨上坤地產:前11月合約銷售金額約為79.2億元
- []訊息:世茂股份:1-11月銷售簽約金額約86億,銷售簽約面積約66萬平方米
- []環球速看:2023年樓市怎么走,房價漲不漲?最早一份機構預測出爐
- []環球觀速訊丨九豐能源:目前,公司境外主要貨源地在馬來西亞、印度尼西亞、澳大利亞、卡塔爾等地,氣源供應優質、穩定
- []天天訊息:天虹股份:可以通過天虹APP及天虹小程序購買天優醬酒
- []環球微頭條丨風能相關上市公司有哪些?風能上市公司龍頭有哪些?
- []鹽上市公司有哪些?相關上市公司龍頭一覽?
- []全球熱門:安防概念股票有哪些?安防概念股龍頭有哪些?
- []【環球新要聞】2021年地熱概念股有哪些?相關地熱概念股一覽?
- []騰訊上市公司股票有哪些?相關騰訊上市公司有哪些?
- []龍光成第二家境內債整體展期房企 展期規模約220億元
- []2021年超導概念股有哪些?超導概念龍頭股一覽?
- []全球視訊!安科生物股票今天多少錢一股?安科生物股票代碼是多少?
- []訊息:2021年銅龍頭概念股有哪些?銅概念股一覽?
- []化纖行業板塊上市公司有哪些?2021年化纖行業板塊股票一覽?
- []環球播報:雄安股票有哪些?相關雄安概念股票有哪些?
- []2021年新冠核酸上市公司龍頭股票有哪些?2021年新冠核酸概念股有哪些?
- []2021年農林牧漁板塊龍頭股有哪些?股票代碼是多少?
- []環球關注:萬里揚: 公司在浙江省的獨立儲能電站項目都在正常推進中
- []人民幣貶值受益股有哪些?人民幣貶值板塊股票2020一覽?
- B站注冊資本增幅400%至5億 目前由陳睿全資持股
- 光源資本出任獨家財務顧問 沐曦集成電路10億元A輪融資宣告完成
- 巨輪智能2021年上半年營收11.24億元 期內研發費用投入增長19.05%
- 紅棗期貨尾盤拉升大漲近6% 目前紅棗市場總庫存約30萬噸
- 嘉銀金科發布2021年Q2財報 期內凈利潤達1.27億元同比增長208%
- 成都銀行2021上半年凈利33.89億元 期內實現營收同比增長17.27億元
- 汽車之家發布2021年第二季度業績 期內新能源汽車品牌收入增長238%
- 中信銀行上半年實現凈利潤290.31億元 期末不良貸款余額706.82億元
- 光伏概念掀起漲停潮交易價格創新高 全天成交額達1.29億元
- 上半年生物藥大增45% 關鍵財務指標好轉營收賬款持續下降
- 【全球新要聞】煤炭股票有哪些?煤炭概念股一覽?
- 哪些是智能手表概念股?智能手表概念股名單一覽?
- 高新興股票價格是多少?高新興公司經營范圍有哪些?
- 焦點熱訊:橡膠V帶概念股票有哪些?橡膠V帶概念股一覽?
- 微動態丨石墨烯上市公司股票有哪些?石墨烯上市公司龍頭一覽?
- 【天天報資訊】OLED概念股有哪些?相關OLED概念股一覽?
- 【熱聞】永太科技:公司以含氟技術為核心,在氟苯精細化學品領域發展多年,產品種類繁多
- 水泥概念龍頭股有哪些?水泥概念股有哪些?
- 環球熱消息:中國鐵建擬發行22億元中期票據用于償還到期債務
- 世界聚焦:ST宏達:公司目前尚未達到撤銷其他風險警示的條件,相關事項請關注公司后續披露
- 國際金價下方支撐仍看向1758美元
- 天天看熱訊:美原油交易策略:供給過剩擔憂升溫,油價或劍指70關口
- 天天資訊:數據 | 我國國際航線旅客量創疫情3年新高,但航班量相比全球仍處較低水平
- 世界快資訊:現貨黃金交易策略:逢低買盤支撐金價,但下行壓力依然較大
- 天天觀點:內部收益率54.56% 聯泓新科碳酸酯鋰電材料項目將于月底前中交
- 全球通訊!華富儲能股東江蘇華富股份被司法凍結 占公司總股本11.96%
- 今日訊!一張圖:交易品種樞紐點+多空占比一覽(2022/12/07周三)
- 今日精選:里程碑丨熱烈慶祝阿詩特能源第十萬臺戶用儲能電池模組下線!
- 【世界快播報】南瑞繼保助力國家電投西藏5站光伏增配儲能保供任務
- 當前觀察:元旦假期公布,旅游平臺機票、酒店搜索應聲上漲超6倍
- 世界觀速訊丨中國機場數字化轉型的現實難題
- 天天快報!貴州山東杭州等地取消落地檢,熱門景區酒店還查核酸嗎?
- 德銀稱近期金價可能測試1750美元支撐,2023年料相對穩定!
- 每日熱文:各地優化疫情防控措施帶動出游熱,旅游產業鏈全面恢復尚需時間
- 豐原藥業:注射用尿促性素屬于促性腺激素藥物
- 環球快資訊:12月7日如意集團漲停分析:抗菌面料,紡織服裝,防護服概念熱股
- 世界熱訊:12月7日民和股份漲停分析:養雞,大農業概念熱股
- 4700米!融和元儲助力世界海拔最高的儲能電站并網投運
- 每日速讀!境內債整體展期獲得通過,龍光將回歸良性健康發展軌道
- 【當前熱聞】12月7日力合科創漲停分析:新冠病毒防治,醫療器械,碳基材料概念熱股
- 江山經開區發展1.13億元競得衢州江山1宗商住用地
- 實時焦點:安瀾城建3.68億元競得舟山岱山縣1宗商住用地
- 方遠房地產7.62億元競得臺州三門縣1宗商住用地 溢價率12.06%
- 環球關注:首開股份50億元公司債券已獲上交所受理
- 郭廣科院長醫美科普為什么有些隆胸術后會很假?
- 環球精選!12月7日漢王科技漲停分析:基因測序,流感/口罩,醫療信息化概念熱股
- 55%看好杭州樓市!貝殼研究院發布購房者置業信心報告
- 北京煤醫田秋梅:想咨詢“花蕊私密整形”又羞于啟齒?
- 北京嘉佩樂醫院靠譜嗎 正規可靠、保護患者就醫權益
- 三維天地助力動物疫控預警預報系統升級改造
- vollgas花式助力葡萄牙,陪你世界杯熬夜看球
- 摩洛哥首度晉級八強,海信電視見證世界杯黑馬誕生
- ? 1場進3球! 海信電視見證21歲葡萄牙小將一戰成名
- 即時焦點:淺議當下奢華酒店產品和服務
- 全球快資訊丨中信建投期貨12月7日早間交易策略
- 天天熱消息:碧桂園擬配售17.8億股 總籌48.06億港元
- 立方數科:有關股東人數請您屆時參看定期報告有關內容
- 學單詞怕忘記——背詞神器小z口袋單詞卡幫你鞏固記憶
- 北京發布“助企紓困12條”支持開發貸款等存量融資合理展期
- 天天即時看!悅心健康:截止11月30日,公司股東總戶數82,729戶,機構股東609戶
- 環球即時:融創發布最新境內債重組方案 未到期債務展期4年
- 環球新消息丨化妝品板塊反彈!產業鏈有望復蘇,機構預計這些個股明年凈利大增
- 每日看點!綠地控股:擬向不超過35名特定投資者非公開發行股票 募資用于保交樓相關項目
- 今亮點!龍湖發布中期股息以股代息計劃 涉及23億美元債券
- 天天熱資訊!千味央廚:有關公司的戰略規劃,請查閱公司披露的定期報告
- 當前速讀:雪榕生物:《OEM交易基礎合同》為框架性協議,該合同的簽訂不會對公司本年度業績造成重大影響
- 每日簡訊:外匯交易提醒:美元逼近200日均線,看漲信號增加,關注加拿大央行決議
- 全球訊息:融資端困難解決之后 房地產下一個問題應如何化解?
- 今日精選:淄博房屋建設開發擬轉讓淄博齊軒地產100%股權 掛牌價2210萬元
- 每日熱聞!江西贛東路橋建設掛牌轉讓華辰置業30%股權 底價為875萬元
- 漢馬科技:公司指定信息披露媒體為《中國證券報》《上海證券報》及上海證券交易所網站
- 每日頭條!270億龍頭出手 風口賽道現30億并購案
- 焦點!中糧糖業:公司今年甜菜采收狀況穩定
- 上海東浩蘭生國貿集團擬2.17億元轉讓灝震國際物流100%股權
- 全球短訊!皖新文化產業投資掛牌重慶皖新文投置業100%股權 底價僅1元
- 【世界新要聞】航企收錢的門道:創新支付方式
- 12月7日重點數據和大事件前瞻
- 【全球快播報】TD早報 | 海南多地調整跨省政策,三亞機票酒店預訂量激增3倍
- 全球聚焦:怎么可以全部提取公積金,有以下四步
- 養老保險余額在哪里查詢 如何查詢養老保險余額
- 全球滾動:業績快報 | 中海前11月合約物業銷售2567億 綠城合約銷售2630億
- 天天滾動:中裝建設:中國郵政儲蓄銀行深圳分行與公司聯合推進的數字人民幣勞務薪資發放系統上線了公司智鏈平臺
- 【全球新視野】公積金能補繳嗎 可以補交公積金嗎
- 聚焦:怎么查孩子交沒交學平險 如何查詢學平險有沒有買
- 全球看點:辭職了公積金怎么取,去公積金中心提取
- 利空加元!加銀本周將進一步激進加息?專家稱市場對此缺乏信心
- 焦點!【實探】北京有序恢復堂食,火鍋店接到20余桌預訂!理發店也要排長隊……
- 華仁藥業:公司管理團隊的簡歷情況請查閱公司在巨潮資訊網披露的《2021年年度報告》
- 京基智農擬為3家子公司提供合計不超過6.16億元擔保
- 建發國際完成配股 獲得8億港元現金
- 【環球快播報】財面兒丨綠地控股:擬向不超過35名特定投資者非公開發行股票
- 世界微資訊!物業丨新大正:1.28億股限售股將于12月12日解禁上市
- 山東章鼓:12月5日公司高管許春東、王崇璞減持公司股份合計18.38萬股
- 鼎龍股份:12月5日公司高管蘇敏光減持公司股份合計1000股
- 今熱點:財面兒|融信中國前11月合約銷售額567.97億元
- 祥生控股前11月合約銷售額228.75億元
- 熱議:中科信息:12月5日公司高管王曉宇減持公司股份合計16.5萬股
- 財面兒丨保利置業前11月合同銷售額450億元
- 環球簡訊:泰福泵業:12月5日公司高管毛世良減持公司股份合計2.23萬股
- 保隆科技:12月5日公司高管尹術飛減持公司股份合計6000股
- 艾迪精密:12月5日公司高管宋飛增持公司股份合計8.14萬股
- 當前通訊!“第三支箭”發力,房企洗牌加速,中小市值國央企存中期成長機會
- 【環球新要聞】沃森生物:疫苗行業具有高投入、高壁壘、高回報、長周期的特點
- 環球熱門:資本月報 | 房企融資利好政策頻出,近期將迎來一波配股潮(2022年11月)
- 簡訊:奧園集團公開招標:出讓奧園健康29.9%股權
- 政策支持房地產平穩健康發展,金科近期利好頻傳
- 全球觀天下!道通科技3名股東合計減持865.76萬股 套現合計2.96億 2022年前三季度公司凈利1.02億
- 金科股份與中國光大銀行重慶分行簽訂戰略合作協議
- 天天觀察:海南多地調整省外來(返)人員政策,三亞“小院兒”民宿預訂量環比增六成
- 當前信息:貝殼靜默期后回購重啟,12月5日耗資200萬美元