最新免费av在线观看,亚洲综合一区成人在线,中文字幕精品无码一区二区三区,中文人妻av高清一区二区,中文字幕乱偷无码av先锋

登錄 免費(fèi)注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)

Programming

Programming 的PDF資料

下載
,219980K
其他型號

Programming的供應(yīng)商:
聯(lián)系人:林小姐
電話:0755-82721172
聯(lián)系人:林小姐/陳小姐/彭小姐
電話:0755-23995323/0755-23915567/0755-83290053
聯(lián)系人:卓小姐/陳小姐
電話:0755-82727234/0755-82722282
聯(lián)系人:吳小姐/李先生
電話:0755-83214943/0755-83748065
>>更多供應(yīng)商

Linux串口通信編程(Linux Serial Programming HOWTO)

查看最近90天中添加的最新產(chǎn)品 最新電子元器件資料免費(fèi)下載 派睿電子TI有獎(jiǎng)問答 - 送3D汽車鼠標(biāo) IR推出采用焊前金屬的汽車級絕緣柵雙極晶體管 全球電子連接器生產(chǎn)商—samtec 最新斷路器保護(hù)套

     最好的偵錯(cuò)你程式碼的方法是建構(gòu)另一臺 Linux box, 并把兩臺電腦用 null-modem 纜線連接. 用 miniterm以傳送字元到你的 Linux box. Miniterm 很容易編譯而它會把所有輸入到鍵盤的字元透過序列埠傳送. 只有這個(gè)宣告定義會被檢查 #define MODEMDEVICE "/dev/ttyS0". 如果是 COM1 設(shè)定為 ttyS0, 如果是 COM2 設(shè)定為 ttyS1 等等.. 先前的測試是必要的, 所有的 字元都將以 raw 方式 (不經(jīng)任何處理) 直接傳送. 測試是否連接正確, 在兩臺電腦上都啟動 miniterm 然後隨便在鍵盤上亂按. 在其中一臺上輸入的字元應(yīng)該會顯示在另一臺電腦上反之亦同. 但輸入的字元不會回應(yīng)到與之相連的螢?zāi)簧? 

要自制 null-modem 的電纜, 你必需要把 TxD (傳送) 及 RxD (接收) 兩線對調(diào).

     當(dāng)然也可以只用一臺電腦來作相同的測試, 只要電腦上有兩個(gè)未使用的序列埠. 當(dāng)然你也就要執(zhí)行兩個(gè) miniterm 來當(dāng)虛擬控制臺. 如果你是藉由拔去滑鼠來取得另一個(gè)序列埠, 記得要把 /dev/mouse 裝置重新導(dǎo)向, 如果它存在的話. 如果你使用多埠的序列埠控制卡, 請確定它已設(shè)定正確. 當(dāng)我在我的電腦上測試時(shí)也曾經(jīng)因?yàn)樵O(shè)定錯(cuò)誤而出過槌. 當(dāng)我連到另一臺電腦, 通訊埠開始傳送字元. 就因?yàn)閯偤眠@不是完整的非同步式傳輸, 所以可在同一臺電腦上執(zhí)行兩個(gè)程式.

連接埠設(shè)定  
     /dev/ttyS* 裝置會被當(dāng)成連接到你的 Linux box 的終端機(jī), 并且在啟動後就設(shè)定好了. 這個(gè)觀念在你寫 raw 裝置的通訊程式時(shí)必需記住. 也就是說這個(gè)連接埠被設(shè)定為回應(yīng)所有自這個(gè)裝置送出的字元, 而用在資料傳輸時(shí)通常這種要改變這種工作模式. 

所有的參數(shù)可以由一個(gè)小程式簡單的完成. 設(shè)定參數(shù)被放在一個(gè)結(jié)構(gòu)體內(nèi) struct termios, 他的定義檔在 : 

#define NCCS 19
struct termios {
        tcflag_t c_iflag;               /* 輸入模式旗標(biāo) */
        tcflag_t c_oflag;               /* 輸出模式旗標(biāo) */
        tcflag_t c_cflag;               /* 控制模式旗標(biāo) */
        tcflag_t c_lflag;               /* 區(qū)域模式旗標(biāo) */
        cc_t c_line;                    /* 行控制 (line discipline) */
        cc_t c_cc[NCCS];                /* 控制特性 */
};

     這個(gè)檔案也包含所有的旗標(biāo)定義. 輸入模式旗標(biāo)在 c_iflag 掌管所有的輸入處理, 這就意謂著由裝置上傳來的字元在還沒用 read 功能讀取前可以先處理過. 同理 c_oflag 掌管所有的輸出處理. c_cflag 包含連接埠的設(shè)定, 如 鮑率, 每字元多少位元, 停止位元, 等等.. 區(qū)域模式旗標(biāo)放在 c_lflag 用來偵測字元是否回應(yīng), 而訊號會送到你的程式, 等等.. 最後 c_cc 陣列定義了檔案終了的控制字元, 停止, 等等.. 預(yù)設(shè)的控制字元值放在 . 有關(guān)旗標(biāo)的細(xì)節(jié)擺在使用手冊 termios(3). termios 結(jié)構(gòu)體內(nèi)的 c_line 行控制 (line discipline) 元素, 不能在 POSIX 相容的系統(tǒng)下使用譯者注:這里所說的 line discipline 雖然我翻成 行控制但還是很難說出那是舍. 如果想知道請看看 kernel :( .


序列裝置的輸入觀念  
     有三個(gè)輸入的觀念要說明. 按照所要寫的應(yīng)用程式選用適合的觀念. 盡量避免使用回圈來讀取單一的字元再組成字串. 我曾這樣做過, 會掉字元, 且對 read 而言不會顯示任何錯(cuò)誤. 


標(biāo)準(zhǔn)輸入程序 
     這是終端機(jī)的標(biāo)準(zhǔn)處理程序, 但用來與其他 dl 型式的以行為單位的輸入通訊也很有用, 也就是 read 會傳回一整行完整的輸入資料. 行預(yù)設(shè)的終止字元是 NL (ASCII LF), 檔案結(jié)束符, 或行終止字元. 預(yù)設(shè)環(huán)境下, CR (是 DOS/Windows 預(yù)設(shè)的行終止符) 不會終止一行的敘述. 

標(biāo)準(zhǔn)的輸入處理程序還可以處理 清除, 刪除字, 重印字元, 及轉(zhuǎn)換 CR 為 NL 等等功能.. 


非標(biāo)準(zhǔn)輸入程序 
     非標(biāo)準(zhǔn)輸入程序可以用在需要每次讀取固定數(shù)量字元的情況, 并允許使用字元輸入時(shí)間的計(jì)時(shí)器. 這種模式可以用在讀取固定字元數(shù)量的應(yīng)用程式, 或者所連接的裝置會突然送出大量字元的狀況. 

 

非同步式輸入 
     以上所敘述的兩種模式都可以用在非同步與同步的傳輸模式. 預(yù)設(shè)是在同步的模式下工作, 也就是在尚未讀取完之前, read 的狀態(tài)會被阻斷. 而非同步模式下 read 的狀態(tài)會直接返回并送出訊號到所叫用的程式直到完成工作. 這個(gè)訊號可以由訊號的處理程式 handler...來接收. 


等待來自多個(gè)訊號來源的輸入 
     這并不是一個(gè)不一樣的輸入模式. 如果你要透過序列埠連接并處理多個(gè)裝置的話, 它是滿有用的. 在我的應(yīng)用程式中我必需在幾乎同一時(shí)間內(nèi), 透過 TCP/IP socket 及序列埠處理來自其他電腦的輸入訊號. 下面這個(gè)□例程式將等待來自兩個(gè)不同輸入源的訊號. 如果其中一個(gè)信號源出現(xiàn), 他就會被處理, 而程式會繼續(xù)等待新的輸入訊號. 

     以下這個(gè)方法看起來相當(dāng)覆雜, 但請記住 Linux 是一個(gè)多工的作業(yè)系統(tǒng). select 這個(gè)系統(tǒng)呼叫并不會在等待輸入訊號時(shí)把 CPU 負(fù)載加重, 而如果你用回圈方式來等待輸入訊號將使得其它同時(shí)執(zhí)行的行程被拖慢. 


程序范例 
     所有的范例來源自 miniterm.c. The type ahead 暫存器被限制在 255 個(gè)字元, 就跟標(biāo)準(zhǔn)輸入程序的最大字串長度相同 ( 或 ).  

     參考程式碼中的注解它會解釋不同輸入模式的使用. 我希望這些程式碼都能被了解. 標(biāo)準(zhǔn)輸入程序的程式范例的注解寫得最好, 其它的
例都只在不同於其它例的地方做注解. 

敘述不是很完整, 但可以激勵(lì)你對這
例做實(shí)驗(yàn), 以延生出合於你所需應(yīng)用程式的最佳解. 

別忘記要把序列埠的權(quán)限設(shè)定正確 (也就是: chmod a+rw /dev/ttyS1)! 



標(biāo)準(zhǔn)輸入程序 

#include 
#include 
#include 
#include 
#include 

/* 鮑率設(shè)定被定義在 , 這在  被引入 */
#define BAUDRATE B38400            
/* 定義正確的序列埠 */
#define MODEMDEVICE "/dev/ttyS1"
#define _POSIX_SOURCE 1 /* POSIX 系統(tǒng)相容 */

#define FALSE 0
#define TRUE 1

volatile int STOP=FALSE; 

main()
{
  int fd,c, res;
  struct termios oldtio,newtio;
  char buf[255];
/* 
  開啟數(shù)據(jù)機(jī)裝置以讀取并寫入而不以控制 tty 的模式
  因?yàn)槲覀儾幌氤淌皆谒统?nbsp;CTRL-C 後就被殺掉.
*/
 fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY ); 
 if (fd <0) {perror(MODEMDEVICE); exit(-1); }

 tcgetattr(fd,&oldtio); /* 儲存目前的序列埠設(shè)定 */
 bzero(&newtio, sizeof(newtio)); /* 清除結(jié)構(gòu)體以放入新的序列埠設(shè)定值 */

/* 
  BAUDRATE: 設(shè)定 bps 的速度. 你也可以用 cfsetispeed 及 cfsetospeed 來設(shè)定.
  CRTSCTS : 輸出資料的硬體流量控制 (只能在具完整線路的纜線下工作
            參考 Serial-HOWTO 第七節(jié))
  CS8     : 8n1 (8 位元, 不做同位元檢查,1 個(gè)終止位元)
  CLOCAL  : 本地連線, 不具數(shù)據(jù)機(jī)控制功能
  CREAD   : 致能接收字元
*/
 newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
 
/*
  IGNPAR  : 忽略經(jīng)同位元檢查後, 錯(cuò)誤的位元組
  ICRNL   : 比 CR 對應(yīng)成 NL (否則當(dāng)輸入訊號有 CR 時(shí)不會終止輸入)
            在不然把裝置設(shè)定成 raw 模式(沒有其它的輸入處理)
*/
 newtio.c_iflag = IGNPAR | ICRNL;
 
/*
 Raw 模式輸出.
*/
 newtio.c_oflag = 0;
 
/*
  ICANON  : 致能標(biāo)準(zhǔn)輸入, 使所有回應(yīng)機(jī)能停用, 并不送出信號以叫用程式
*/
 newtio.c_lflag = ICANON;
 
/* 
  初始化所有的控制特性
  預(yù)設(shè)值可以在 /usr/include/termios.h 找到, 在注解中也有,
  但我們在這不需要看它們
*/
 newtio.c_cc[VINTR]    = 0;     /* Ctrl-c */ 
 newtio.c_cc[VQUIT]    = 0;     /* Ctrl-\ */
 newtio.c_cc[VERASE]   = 0;     /* del */
 newtio.c_cc[VKILL]    = 0;     /* @ */
 newtio.c_cc[VEOF]     = 4;     /* Ctrl-d */
 newtio.c_cc[VTIME]    = 0;     /* 不使用分割字元組的計(jì)時(shí)器 */
 newtio.c_cc[VMIN]     = 1;     /* 在讀取到 1 個(gè)字元前先停止 */
 newtio.c_cc[VSWTC]    = 0;     /* '\0' */
 newtio.c_cc[VSTART]   = 0;     /* Ctrl-q */ 
 newtio.c_cc[VSTOP]    = 0;     /* Ctrl-s */
 newtio.c_cc[VSUSP]    = 0;     /* Ctrl-z */
 newtio.c_cc[VEOL]     = 0;     /* '\0' */
 newtio.c_cc[VREPRINT] = 0;     /* Ctrl-r */
 newtio.c_cc[VDISCARD] = 0;     /* Ctrl-u */
 newtio.c_cc[VWERASE]  = 0;     /* Ctrl-w */
 newtio.c_cc[VLNEXT]   = 0;     /* Ctrl-v */
 newtio.c_cc[VEOL2]    = 0;     /* '\0' */

/* 
  現(xiàn)在清除數(shù)據(jù)機(jī)線并啟動序列埠的設(shè)定
*/
 tcflush(fd, TCIFLUSH);
 tcsetattr(fd,TCSANOW,&newtio);

/*
  終端機(jī)設(shè)定完成, 現(xiàn)在處理輸入訊號
  在這個(gè)□例, 在一行的開始處輸入 'z' 會退出此程式.
*/
 while (STOP==FALSE) {     /* 回圈會在我們發(fā)出終止的訊號後跳出 */
 /* 即使輸入超過 255 個(gè)字元, 讀取的程式段還是會一直等到行終結(jié)符出現(xiàn)才停止.
    如果讀到的字元組低於正確存在的字元組, 則所剩的字元會在下一次讀取時(shí)取得.
    res 用來存放真正讀到的字元組個(gè)數(shù) */
    res = read(fd,buf,255); 
    buf[res]=0;             /* 設(shè)定字串終止字元, 所以我們能用 printf */
    printf(":%s:%d\n", buf, res);
    if (buf[0]=='z') STOP=TRUE;
 }
 /* 回存舊的序列埠設(shè)定值 */
 tcsetattr(fd,TCSANOW,&oldtio);
}



3.2 非標(biāo)準(zhǔn)輸入程序  
     在非標(biāo)準(zhǔn)的輸入程序模式下, 輸入的資料不會被組合成一行而輸入後的處理功能 (清除, 殺掉, 刪除, 等等.) 都不能使用. 這個(gè)模式有兩個(gè)功能控制參數(shù): c_cc[VTIME] 設(shè)定字元輸入時(shí)間計(jì)時(shí)器, 及 c_cc[VMIN] 設(shè)定滿足讀取功能的字元接收個(gè)數(shù). 

如果 MIN > 0 且 TIME = 0, MIN 設(shè)定為滿足讀取功能的字元接收個(gè)數(shù). 由於 TIME 是 零, 所以計(jì)時(shí)器將不被使用. 

如果 MIN = 0 且 TIME > 0, TIME 將被當(dāng)做逾時(shí)設(shè)定值. 滿足讀取功能的情況為讀取到單一字元, 或者超過 TIME 所定義的時(shí)間 (t = TIME *0.1 s). 如果超過 TIME 所定義的時(shí)間, 則不會傳回任何字元. 

如果 MIN > 0 且 TIME > 0, TIME 將被當(dāng)做一個(gè)分割字元組的計(jì)時(shí)器. 滿足讀取功能的條件為 接收到  MIN 個(gè)數(shù)的字元, 或兩個(gè)字元的間隔時(shí)間超過 TIME 所定義的值. 計(jì)時(shí)器會在每讀到一個(gè)字元後重新計(jì)時(shí), 且只會在第一個(gè)字元收到後才會啟動. 

如果 MIN = 0 且 TIME = 0, 讀取功能就馬上被滿足. 目前所存在的字元組個(gè)數(shù), 或者 將回傳的字元組個(gè)數(shù). 根據(jù)  Antonino (參考 貢獻(xiàn)) 所說, 你可以用 fcntl(fd, F_SETFL, FNDELAY); 在讀取前得到相同的結(jié)果. 

藉由修改 newtio.c_cc[VTIME] 及 newtio.c_cc[VMIN] 上述的模式就可以測試了. 


#include 
#include 
#include 
#include 
#include 

#define BAUDRATE B38400
#define MODEMDEVICE "/dev/ttyS1"
#define _POSIX_SOURCE 1 /* POSIX 系統(tǒng)相容 */
#define FALSE 0
#define TRUE 1

volatile int STOP=FALSE; 

main()
{
  int fd,c, res;
  struct termios oldtio,newtio;
  char buf[255];

 fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY ); 
 if (fd <0) {perror(MODEMDEVICE); exit(-1); }

 tcgetattr(fd,&oldtio); /* 儲存目前的序列埠設(shè)定 */

 bzero(&newtio, sizeof(newtio));
 newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
 newtio.c_iflag = IGNPAR;
 newtio.c_oflag = 0;

 /* 設(shè)定輸入模式 (非標(biāo)準(zhǔn)型, 不回應(yīng),...) */
 newtio.c_lflag = 0;
 
 newtio.c_cc[VTIME]    = 0;   /* 不使用分割字元組計(jì)時(shí)器 */
 newtio.c_cc[VMIN]     = 5;   /* 在讀取到 5 個(gè)字元前先停止 */

 tcflush(fd, TCIFLUSH);
 tcsetattr(fd,TCSANOW,&newtio);


 while (STOP==FALSE) {       /* 輸入回圈 */
   res = read(fd,buf,255);   /* 在輸入 5 個(gè)字元後即返回 */
   buf[res]=0;               /* 所以我們能用 printf... */
   printf(":%s:%d\n", buf, res);
   if (buf[0]=='z') STOP=TRUE;
 }
 tcsetattr(fd,TCSANOW,&oldtio);
}


3.3 非同步式輸入 

#include 
#include 
#include 
#include 
#include 
#include 

#define BAUDRATE B38400
#define MODEMDEVICE "/dev/ttyS1"
#define _POSIX_SOURCE 1 /* POSIX 系統(tǒng)相容 */
#define FALSE 0
#define TRUE 1

volatile int STOP=FALSE; 

void signal_handler_IO (int status);   /* 定義訊號處理程序 */
int wait_flag=TRUE;                    /* 沒收到訊號的話就會是 TRUE */

main()
{
  int fd,c, res;
  struct termios oldtio,newtio;
  struct sigaction saio;           /* definition of signal action */
  char buf[255];

  /* 開啟裝置為 non-blocking (讀取功能會馬上結(jié)束返回) */
  fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY | O_NONBLOCK);
  if (fd <0) {perror(MODEMDEVICE); exit(-1); }

  /* 在使裝置非同步化前, 安裝訊號處理程序 */
  saio.sa_handler = signal_handler_IO;
  saio.sa_mask = 0;
  saio.sa_flags = 0;
  saio.sa_restorer = NULL;
  sigaction(SIGIO,&saio,NULL);
  
  /* 允許行程去接收 SIGIO 訊號*/
  fcntl(fd, F_SETOWN, getpid());
  /* 使檔案ake the file descriptor 非同步 (使用手冊上說只有 O_APPEND 及
  O_NONBLOCK, 而 F_SETFL 也可以用...) */
  fcntl(fd, F_SETFL, FASYNC);

  tcgetattr(fd,&oldtio); /* 儲存目前的序列埠設(shè)定值 */
  /* 設(shè)定新的序列埠為標(biāo)準(zhǔn)輸入程序 */
  newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
  newtio.c_iflag = IGNPAR | ICRNL;
  newtio.c_oflag = 0;
  newtio.c_lflag = ICANON;
  newtio.c_cc[VMIN]=1;
  newtio.c_cc[VTIME]=0;
  tcflush(fd, TCIFLUSH);
  tcsetattr(fd,TCSANOW,&newtio);
 
  /* 等待輸入訊號的回圈. 很多有用的事我們將在這做 */ 
  while (STOP==FALSE) {
    printf(".\n");usleep(100000);
    /* 在收到 SIGIO 後, wait_flag = FALSE, 輸入訊號存在則可以被讀取 */
    if (wait_flag==FALSE) { 
      res = read(fd,buf,255);
      buf[res]=0;
      printf(":%s:%d\n", buf, res);
      if (res==1) STOP=TRUE; /* 如果只輸入 CR 則停止回圈 */
      wait_flag = TRUE;      /* 等待新的輸入訊號 */
    }
  }
  /* 回存舊的序列埠設(shè)定值 */
  tcsetattr(fd,TCSANOW,&oldtio);
}

/***************************************************************************
* 訊號處理程序. 設(shè)定 wait_flag 為 FALSE, 以使上述的回圈能接收字元          *
***************************************************************************/

void signal_handler_IO (int status)
{
  printf("received SIGIO signal.\n");
  wait_flag = FALSE;
}


3.4 等待來自多個(gè)訊號來源的輸入  
     這一段很短. 它只能被拿來當(dāng)成寫程式時(shí)的提示, 故□例程式也很簡短. 但這個(gè)□例不只能用在序列埠上, 還可以用在被當(dāng)成檔案來使用的裝置上.  

     select 呼叫及伴隨它所引發(fā)的巨集共用 fd_set. fd_set 則是一個(gè)位元陣列, 而其中每一個(gè)位元代表一個(gè)有效的檔案敘述結(jié)構(gòu). select 呼叫接受一個(gè)有效的檔案敘述結(jié)構(gòu)并傳回 fd_set 位元陣列, 而該位元陣列中若有某一個(gè)位元為 1, 就表示相對映的檔案敘述結(jié)構(gòu)的檔案發(fā)生了輸入, 輸出或有例外事件. 而這些巨集提供了所有處理 fd_set 的功能. 亦可參考手冊 select(2). 


#include 
#include 
#include 

main()
{
   int    fd1, fd2;  /* 輸入源 1 及 2 */
   fd_set readfs;    /* 檔案敘述結(jié)構(gòu)設(shè)定 */
   int    maxfd;     /* 最大可用的檔案敘述結(jié)構(gòu) */
   int    loop=1;    /* 回圈在 TRUE 時(shí)成立 */ 

   /* open_input_source 開啟一個(gè)裝置, 正確的設(shè)定好序列埠,
      并回傳回此檔案敘述結(jié)構(gòu)體 */
   fd1 = open_input_source("/dev/ttyS1");   /* COM2 */
   if (fd1<0) exit(0);
   fd2 = open_input_source("/dev/ttyS2");   /* COM3 */
   if (fd2<0) exit(0);
   maxfd = MAX (fd1, fd2)+1;  /* 測試最大位元輸入 (fd) */

   /* 輸入回圈 */
   while (loop) {
     FD_SET(fd1, &readfs);  /* 測試輸入源 1 */
     FD_SET(fd2, &readfs);  /* 測試輸入源 2 */
     /* block until input becomes available */
     select(maxfd, &readfs, NULL, NULL, NULL);
     if (FD_ISSET(fd1))         /* 如果輸入源 1 有訊號 */
       handle_input_from_source1();
     if (FD_ISSET(fd2))         /* 如果輸入源 2 有訊號 */
       handle_input_from_source2();
   }

}    

     這個(gè)□例程式在等待輸入訊號出現(xiàn)前, 不能確定它會停頓下來. 如果你需要在輸入時(shí)加入逾時(shí)功能, 只需把 select 呼叫換成: 

int res;
struct timeval Timeout;

/* 設(shè)定輸入回圈的逾時(shí)值 */
Timeout.tv_usec = 0;  /* 毫秒 */
Timeout.tv_sec  = 1;  /* 秒 */
res = select(maxfd, &readfs, NULL, NULL, &Timeout);
if (res==0)
/* 檔案敘述結(jié)構(gòu)數(shù)在 input = 0 時(shí), 會發(fā)生輸入逾時(shí). */  

     這個(gè)程式會在 1 秒鐘後逾時(shí). 如果超過時(shí)間, select 會傳回 0, 但是應(yīng)該留意 Timeout 的時(shí)間遞減是由 select 所等待輸入訊號的時(shí)間為基準(zhǔn). 如果逾時(shí)的值是 0, select 會馬上結(jié)束返回. 

  



  來源:ks99
收藏此頁】【關(guān)閉】【返回】【打印】【推薦
分享: QQ空間 人人網(wǎng) 開心網(wǎng) 騰訊微博 新浪微博 搜狐微博 網(wǎng)易微博
本頁面信息由維庫用戶提供,如有侵犯您的知識產(chǎn)權(quán),請致電本站,本站核實(shí)后將迅速刪除!

熱門詞條:微型計(jì)算機(jī)系統(tǒng)灼熱絲試驗(yàn)儀pH計(jì)紅外網(wǎng)絡(luò)攝像機(jī)電力電容器隔爆工業(yè)熱電偶OSP智能卡訪問控制系統(tǒng)蓄電池活化儀器有機(jī)硅膠更多>>
相關(guān)文章
  • 更多"Programming"相關(guān)文章
  • 關(guān)于我們 | 服務(wù)項(xiàng)目 | 付款方式 | 聯(lián)系我們 | 友情鏈接 | 投訴 建議 合作 | 網(wǎng)站地圖 | 加入收藏 | 公司庫
    © 2025 維庫電子市場網(wǎng)(www.udpf.com.cn) 版權(quán)所有 經(jīng)營許可證編號:浙B2-20050339 版權(quán)聲明
    二十一年專注打造優(yōu)質(zhì)電子元器件采購網(wǎng)、IC交易平臺。