當前位置:首頁 > 通信技術(shù) > 通信模塊
[導讀]   串行接口是一種可以將接受來自CPU的并行數(shù)據(jù)字符轉(zhuǎn)換為連續(xù)的串行數(shù)據(jù)流發(fā)送出去,同時可將接受的串行數(shù)據(jù)流轉(zhuǎn)換為并行的數(shù)據(jù)字符供給CPU的器件。一般完成這種功能的電路,我們稱為串行接口電路。

  串行接口是一種可以將接受來自CPU的并行數(shù)據(jù)字符轉(zhuǎn)換為連續(xù)的串行數(shù)據(jù)流發(fā)送出去,同時可將接受的串行數(shù)據(jù)流轉(zhuǎn)換為并行的數(shù)據(jù)字符供給CPU的器件。一般完成這種功能的電路,我們稱為串行接口電路。

  串口通信結(jié)構(gòu)

  串口通信是指外設(shè)和計算機間,通過數(shù)據(jù)信號線 、地線、控制線等,按位進行傳輸數(shù)據(jù)的一種通訊方式。這種通信方式使用的數(shù)據(jù)線少,在遠距離通信中可以節(jié)約通信成本,但其傳輸速度比并行傳輸?shù)汀?/p>

  串口是計算機上一種非常通用的設(shè)備通信協(xié)議。大多數(shù)計算機(不包括筆記本電腦)包含兩個基于RS-232的串口。串口同時也是儀器儀表設(shè)備通用的通信協(xié)議;很多GPIB兼容的設(shè)備也帶有RS-232口。同時,串口通信協(xié)議也可以用于獲取遠程采集設(shè)備的數(shù)據(jù)。

  RS-232(ANSI/EIA-232標準)是IBM-PC及其兼容機上的串行連接標準。可用于許多用途,比如連接鼠標、打印機或者Modem,同時也可以接工業(yè)儀器儀表。用于驅(qū)動和連線的改進,實際應用中RS-232的傳輸長度或者速度常常超過標準的值。RS-232只限于PC串口和設(shè)備間點對點的通信。RS-232串口通信最遠距離是50英尺。

  串口通信

  串口通信是在工程應用中很常見。在上位機與下位機通訊過程中常通過有線的串口進行通信,在低速傳輸模式下串口通信得到廣泛使用。在說個之前先來簡單解釋一下上位機與下位機的概念。

  上位機與下位機設(shè)計

  通常上位機指的是PC,下位機指的是單片機或者帶微處理器的系統(tǒng)。下位機一般是將模擬信號經(jīng)過AD采集將模擬量轉(zhuǎn)換為數(shù)字量,下位機再經(jīng)過數(shù)字信號處理以后將數(shù)字信號通過串口發(fā)送到上位機,相反上位機可以給下位機發(fā)送一些指令或者信息。常見的通信串口包括RS232、RS485、RS422等。這些串口只是在電平特性有所不同,在上位機與下位機進行數(shù)據(jù)通信時可以不考慮電平特性,而且現(xiàn)在在硬件上有各種轉(zhuǎn)接接口,使用起來也很方便。

  當然在通常做簡單的串口UART實驗時我們可以使用各種各樣的串口助手小軟件,但是這些串口小工具有時候并不能很好滿足需求,那就嘗試著自己寫一套屬于自己的串口助手?接下來說說如何使用java實現(xiàn)上位機與下位機之間的RS485串口通信。

  step 1: 下載支持java串口通信的jar包,這里給出下載地址:

  http://files.cnblogs.com/files/Dreamer-1/mfz-rxtx-2.2-20081207-win-x86.zip(32bit 下載地址)

  http://files.cnblogs.com/files/Dreamer-1/mfz-rxtx-2.2-20081207-win-x64.zip (64位下載地址)

  對以上的版本解釋一下,因為本人在這里踩了一個坑,32位或者64位是與ecplise/myecplise一致,要是版本弄錯了會報錯。

  step 2:下載了那個jar包解壓后會出現(xiàn)一下內(nèi)容:

  

  這個文件夾里面需要注意兩點:jar包RXTXcomm需要導入到java工程里面去。另外就是需要將rxtxParallel.dll與rxtxSerial.dll復制在安轉(zhuǎn)JDK的bin文件下和jre的bin文件夾下面,這樣才能保證能夠正常使用這個jar包。以下是將兩個dll文件復制的位置:

  C:Program Files (x86)Javajdk1.8.0_25in

  C:Program Files (x86)Javajdk1.8.0_25jrein12

  怎么講jar包導入java工程里面就是比較簡單的操作,可以參考:http://jingyan.baidu.com/arTIcle/ca41422fc76c4a1eae99ed9f.html

  step 3:RXTXComm Api如何使用

  接下來就是使用該導入jar包進行編碼實現(xiàn)串口通信的功能了。在編碼之前先來理一理串口通信的主要環(huán)節(jié),本人總結(jié)主要分為以下幾點:

  1)計算機首先需要進行硬件check,查找是否有可用的COM端口,并對該對端口進行簡要判斷,包括這些端口是否是串口,是否正在使用。以下是部分主要代碼:

  /*類方法 不可改變 不接受繼承

  * 掃描獲取可用的串口

  * 將可用串口添加至list并保存至list

  */

  public staTIc final ArrayList《String》 uartPortUseAblefind()

  {

  //獲取當前所有可用串口

  //由CommPorTIdenTIfier類提供方法

  Enumeration《CommPortIdentifier》 portList=CommPortIdentifier.getPortIdentifiers();

  ArrayList《String》 portNameList=new ArrayList();

  //添加并返回ArrayList

  while(portList.hasMoreElements())

  {

  String portName=portList.nextElement().getName();

  portNameList.add(portName);

  }

  return portNameList;

  }123456789101112131415161718

  以下是測試類的測試實例:

  ArrayList《String》 arraylist=UARTParameterSetup.uartPortUseAblefind();

  int useAbleLen=arraylist.size();

  if(useAbleLen==0)

  {

  System.out.println(“沒有找到可用的串口端口,請check設(shè)備!”);

  }

  else

  {

  System.out.println(“已查詢到該計算機上有以下端口可以使用:”);

  for(int index=0;index《arraylist.size();index++)

  {

  System.out.println(“該COM端口名稱:”+arraylist.get(index));

  //測試串口配置的相關(guān)方法

  }

  } 123456789101112131415

  2)通過計算機對串口的自檢后,可以對串口參數(shù)進行簡單的配置。常見的配置可以從常見的串口助手中得到啟發(fā)。以下是一個串口助手的人機交換界面:

  

  以下是對串口設(shè)置主要代碼:

  /*

  * 串口常見設(shè)置

  * 1)打開串口

  * 2)設(shè)置波特率 根據(jù)單板機的需求可以設(shè)置為57600 。。。

  * 3)判斷端口設(shè)備是否為串口設(shè)備

  * 4)端口是否占用

  * 5)對以上條件進行check以后返回一個串口設(shè)置對象new UARTParameterSetup()

  * 6)return:返回一個SerialPort一個實例對象,若判定該com口是串口則進行參數(shù)配置

  * 若不是則返回SerialPort對象為null

  */

  public static final SerialPort portParameterOpen(String portName,int baudrate)

  {

  SerialPort serialPort=null;

  try

  { //通過端口名識別串口

  CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);

  //打開端口并設(shè)置端口名字 serialPort和超時時間 2000ms

  CommPort commPort=portIdentifier.open(portName,1000);

  //進一步判斷comm端口是否是串口 instanceof

  if(commPort instanceof SerialPort)

  {

  System.out.println(“該COM端口是串口!”);

  //進一步強制類型轉(zhuǎn)換

  serialPort=(SerialPort)commPort;

  //設(shè)置baudrate 此處需要注意:波特率只能允許是int型 對于57600足夠

  //8位數(shù)據(jù)位

  //1位停止位

  //無奇偶校驗

  serialPort.setSerialPortParams(baudrate, SerialPort.DATABITS_8,SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);

  //串口配制完成 log

  System.out.println(“串口參數(shù)設(shè)置已完成,波特率為”+baudrate+“,數(shù)據(jù)位8bits,停止位1位,無奇偶校驗”);

  }

  //不是串口

  else

  {

  System.out.println(“該com端口不是串口,請檢查設(shè)備!”);

  //將com端口設(shè)置為null 默認是null不需要操作

  }

  }

  catch (NoSuchPortException e)

  {

  e.printStackTrace();

  }

  catch (PortInUseException e)

  {

  e.printStackTrace();

  }

  catch (UnsupportedCommOperationException e)

  {

  e.printStackTrace();

  }

  return serialPort;

  }12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455

  以上代碼就是返回一個對象,同時也返回了對象屬性,因為對象在java里面是屬于傳值引用。對以上需要說明的是:在實驗時需要連接串口才能讓計算機檢測到才能讓程序工作,這里使用的是RS485轉(zhuǎn)接線:

  

  3)通過以上兩個步驟后基本對串口的設(shè)置也完成了,對于串口類型的確認例如:RS232/RS485/RS422等,可以作為進一步確認的條件。RS485可以在gnu.io中找到。

  

  接下來就是上位機與下位機之間的雙向通信的功能實現(xiàn)了。該部分主要是利用java的輸入輸出流來實現(xiàn)。以下是主要代碼:

  /*

  * 串口數(shù)據(jù)發(fā)送以及數(shù)據(jù)傳輸作為一個類

  * 該類做主要實現(xiàn)對數(shù)據(jù)包的傳輸至下單板機

  */

  class DataTransimit

  {

  /*

  * 上位機往單板機通過串口發(fā)送數(shù)據(jù)

  * 串口對象 seriesPort

  * 數(shù)據(jù)幀:dataPackage

  * 發(fā)送的標志:數(shù)據(jù)未發(fā)送成功拋出一個異常

  */

  public static void uartSendDatatoSerialPort(SerialPort serialPort,byte[] dataPackage)

  {

  OutputStream out=null;

  try

  {

  out=serialPort.getOutputStream();

  out.write(dataPackage);

  out.flush();

  } catch (IOException e)

  {

  e.printStackTrace();

  }finally

  {

  //關(guān)閉輸出流

  if(out!=null)

  {

  try

  {

  out.close();

  out=null;

  System.out.println(“數(shù)據(jù)已發(fā)送完畢!”);

  } catch (IOException e)

  {

  e.printStackTrace();

  }

  }

  }

  }

  /*

  * 上位機接收數(shù)據(jù)

  * 串口對象seriesPort

  * 接收數(shù)據(jù)buffer

  * 返回一個byte數(shù)組

  */

  public static byte[] uartReceiveDatafromSingleChipMachine(SerialPort serialPort)

  {

  byte[] receiveDataPackage=null;

  InputStream in=null;

  try

  {

  in=serialPort.getInputStream();

  //獲取data buffer數(shù)據(jù)長度

  int bufferLength=in.available();

  while(bufferLength!=0)

  {

  receiveDataPackage=new byte[bufferLength];

  in.read(receiveDataPackage);

  bufferLength=in.available();

  }

  }

  catch (IOException e)

  {

  e.printStackTrace();

  }

  return receiveDataPackage;

  } 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970

  通過以上關(guān)于Uart兩個基本類實現(xiàn)對底層Uart的功能封裝,其中一個類主要負責Uart串口自檢和基本設(shè)置,另外一個類主要has數(shù)據(jù)傳輸?shù)膬蓚€方法。接下來以一個實例說一說通過RS485串口通信將系統(tǒng)當前時間發(fā)送至單板機系統(tǒng)。

  step 4:實現(xiàn)實時系統(tǒng)時間的數(shù)據(jù)包傳輸至下位機

  這一步可以分為以下兩個步驟:首先實現(xiàn)獲取系統(tǒng)時間,將時間進行封裝成幀;另外就是通過RS485串口將時間數(shù)據(jù)包發(fā)送至單板機系統(tǒng)進行解析。

  1) 系統(tǒng)時間的獲取

  根據(jù)java面對對象設(shè)計思想,這里將有關(guān)系統(tǒng)時間的方法歸為一類。

  以下是獲取當前系統(tǒng)時間代碼:

  public static String getCurrentDateTime()

  {

  //單例模式

  Calendar calendar=Calendar.getInstance();

  int year = calendar.get(Calendar.YEAR);//獲取年份

  int month=calendar.get(Calendar.MONTH);//獲取月份

  int day=calendar.get(Calendar.DATE);//獲取日期

  int minute=calendar.get(Calendar.MINUTE);//分

  int hour=calendar.get(Calendar.HOUR);//小時

  int second=calendar.get(Calendar.SECOND);//秒

  String curerentDateTime = year + “ ” + (month + 1 )+ “ ” + day + “ ”+ (hour+12) + “ ” + minute + “ ” + second + “ ”;

  timeCheckSum=year+(month+1)+day+(hour+12)+minute+second;

  return curerentDateTime;

  }1234567891011121314

  java 提供了calender類,該類提供了一些與時間有關(guān)方法。至于Calendar.getInstance()使用單例模式獲取一個Calendar實例對象,單例模式就是一個類在任何時候只允許有一個實例化對象。獲取系統(tǒng)時間除了使用Calendar還可以使用Date類,通過創(chuàng)建對象也可以實現(xiàn)系統(tǒng)當前時間的獲取。timeCheckSum作為時間數(shù)據(jù)的校驗和發(fā)送至單板機作為自定義協(xié)議的一部分。

  由于發(fā)送的數(shù)據(jù)包通常是以字節(jié)(byte)為單位進行發(fā)送和傳輸?shù)?,因此需要將int型的時間轉(zhuǎn)換為byte使用byte[]進行存儲,作為一個數(shù)據(jù)包發(fā)送。

  /*

  * 將以上時間字符串進行隔開用byte[]保存

  */

  public static byte[] dateTimeBytesGet(String currenDateTime)

  {

  //對當前時間參數(shù)進行格式判斷

  //對格式進行判斷

  int rawDataSize=6;

  byte[] dateTimeBytes=new byte[rawDataSize+1];

  String[] currentDateTimeSplit=currenDateTime.split(“ ”);

  if(currentDateTimeSplit.length==rawDataSize)

  {

  //時間數(shù)據(jù)格式正確

  //eg 2016 12 23 22 18 26

  //使用byte[]進行存儲時需要 -128~+127

  //對于年份使用兩個byte存儲

  for(int dataIndex=0;dataIndex《rawDataSize;dataIndex++)

  {

  int dateTemp=Integer.parseInt(currentDateTimeSplit[dataIndex]);

  if(dataIndex==0)

  {

  byte H8bits=(byte)((dateTemp)》》8);

  byte L8bits=(byte)((dateTemp)&0xff);

  dateTimeBytes[dataIndex]= H8bits;

  dateTimeBytes[dataIndex+1]= L8bits;

  }

  dateTimeBytes[dataIndex+1]=(byte)dateTemp;

  }

  }else

  {

  System.out.println(“當前時間獲取出現(xiàn)異常數(shù)據(jù)”);

  System.exit(-1);

  dateTimeBytes=null;

  }

  return dateTimeBytes;

  }123456789101112131415161718192021222324252627282930313233343536

  以上數(shù)據(jù)可以使用7個byte對時間數(shù)據(jù)進行存儲,因為年份需要使用兩個字節(jié)來存儲,格式為高字節(jié)在前,低字節(jié)在后,之后依次存放。

  將時間數(shù)據(jù)存放在byte[]數(shù)組以后接下來就是添加自己的協(xié)議部分了。該部分具有較大的隨意性,因為該協(xié)議可以根據(jù)不同的風格有不同的形式。為了簡單起見,只需要在時間數(shù)據(jù)byte[]之前添加head、CMD、時間數(shù)據(jù)長度length這三個字節(jié)進行補充,時間數(shù)據(jù)byte[]后面依次添加校驗和的高低字節(jié)以及tail指令即可。以上基本實現(xiàn)了一個簡單的時間數(shù)據(jù)package。以下是本模塊的代碼:

  /*

  * 將數(shù)組封裝成幀

  * 每一個數(shù)據(jù)幀由以下幾個部分組成

  * 1)數(shù)據(jù)包頭部 head 0X2F

  * 2)數(shù)據(jù)包命令 CMD 0X5A

  * 3)數(shù)據(jù)個數(shù) length of data 7

  * 4)校驗和 H8/L8 byte of check sum(高字節(jié)在前 低字節(jié)在后)

  * 5)數(shù)據(jù)結(jié)尾標志 tail OX30

  * 6)可采用線程進行獲取當前時間

  */

  public static byte[] makeCurrentDateTimefromStringtoFramePackage(byte[] dateTimeBytes)

  {

  //在時間byte[]前后添加一些package校驗信息

  int dataLength=13;

  byte[] terimalTimePackage=new byte[dataLength];

  //裝填信息

  //時間數(shù)據(jù)包之前的信息

  terimalTimePackage[0]=0x2F;

  terimalTimePackage[1]=0X5A;

  terimalTimePackage[2]=7;

  //計算校驗和

  //轉(zhuǎn)化為無符號進行校驗

  for(int dataIndex=0;dataIndex《dateTimeBytes.length;dataIndex++)

  {

  terimalTimePackage[dataIndex+3]=dateTimeBytes[dataIndex];

  }

  //將校驗和分為高低字節(jié)

  byte sumH8bits=(byte)((timeCheckSum)》》8);

  byte sumL8bits=(byte)((timeCheckSum)&0xff);

  terimalTimePackage[10]=sumH8bits;//高字節(jié)在前

  terimalTimePackage[11]=sumL8bits;//低字節(jié)在后

  //數(shù)據(jù)包結(jié)尾

  terimalTimePackage[12]=0X30;

  return terimalTimePackage;

  }1234567891011121314151617181920212223242526272829303132333435

  下面給出了將時間數(shù)據(jù)byte數(shù)組進行解析的debug代碼,一方面是確定上位機本部分模塊的程序可靠性,另外也可以直接移植到下位機對數(shù)據(jù)包的解析之中。在下位機解析過程中需要注意一點:因為在java中8大基本類型都是帶符號,年份時間和時間校驗和拆分為高低字節(jié)時,低字節(jié)是二進制無符號的,但是計算機卻是按照有符號數(shù)(補碼方式)進行讀取,例如在2016年轉(zhuǎn)換為二進制數(shù)為:11111100000,那么高字節(jié)為00000111,低字節(jié)為11100000。計算機讀取為:高字節(jié)為7,低字節(jié)為-32。其實由兩個byte真實還原的過程應為:7《《8+(低字節(jié)二進制數(shù)字)=7*256+224=2016,因此在debug解析時間數(shù)據(jù)包時需要將有符號數(shù)字轉(zhuǎn)換為無符號數(shù)字。

  /*

  * 對時間格式進行解析并還原原來的時間格式

  * 對數(shù)據(jù)進行還原

  * 僅限于debug使用

  */

  public static String dateTimeBytesfromTostring(byte[] currentDateTime)

  {

  String string=“”;

  if(currentDateTime.length==7)

  {

  string=((currentDateTime[0]《《8)+bytetoUnsigendInt(currentDateTime[1]))+“ ”+currentDateTime[2]+“ ”+

  currentDateTime[3]+“ ”+currentDateTime[4]+“ ”+currentDateTime[5]+“ ”+

  currentDateTime[6];

  }

  return string;

  }

  /*

  * 將byte轉(zhuǎn)化為字符串

  * 將有符號byte轉(zhuǎn)化為無符號數(shù)字

  * debug使用

  */

  public static int bytetoUnsigendInt(byte aByte)

  {

  String s=String.valueOf(aByte);

  //System.out.println(s);

  int bytetoUnsigendInt=0;

  for(int i=0;i《s.length();i++)

  {

  if(s.charAt(i)!=‘0’)

  {

  bytetoUnsigendInt+=1《《(7-i);

  }

  }

  return bytetoUnsigendInt;

  }12345678910111213141516171819202122232425262728293031323334353637

  2)將最后的時間數(shù)據(jù)包通過RS485串口發(fā)送至下位機

  結(jié)合前面的串口程序就可以使用串口發(fā)送程序了。在程序debug的前期可以在程序的關(guān)鍵位置輸出日志就是打印log的方法可以提高程序調(diào)試的效率。以下是主類的測試代碼:

  //取出第一個COM端口進行測試

  SerialPort serialPort=UARTParameterSetup.portParameterOpen(arraylist.get(0), 57600);

  //退出程序 后續(xù)不需要監(jiān)測 因為transimit一直需要保證連接狀態(tài)

  //System.exit(0);

  DataTransimit.uartSendDatatoSerialPort(serialPort, dataFrame);

  String currentDateTime=SystemDateTimeGet.getCurrentDateTime();

  System.out.println(currentDateTime);

  byte[] bytes=SystemDateTimeGet.dateTimeBytesGet(currentDateTime);

  //System.out.println(Arrays.toString(bytes));

  String str=SystemDateTimeGet.dateTimeBytesfromTostring(bytes);

  System.out.println(str);

  //System.out.println(SystemDateTimeGet.bytetoUnsigendInt((byte) -32));

  byte[] terimalTimeByte=SystemDateTimeGet.makeCurrentDateTimefromStringtoFramePackage(bytes);

  System.out.println(Arrays.toString(terimalTimeByte));

  DataTransimit.uartSendDatatoSerialPort(serialPort, terimalTimeByte);123456789101112131415

  以下是測試結(jié)果:

  當沒有串口設(shè)備接入計算機時控制臺打印一條信息:

  沒有找到可用的串口端口,請check設(shè)備!

  12

  當RS485設(shè)備接入計算機時,控制臺打印消息如下:

  

  通過以上幾個步驟基本實現(xiàn)了上位機與下位機串口通信的功能,接下來還可以對程序進行改進:

  1)添加界面,可以類比串口助手界面根據(jù)自身需要設(shè)計獨具風格的人機交互界面。

  2) 在程序中添加線程,在以上程序中對于系統(tǒng)時間的獲取可以通過線程的方式進行獲取,這樣上位機就可以一直往下位機發(fā)送數(shù)據(jù)包,而不是僅僅發(fā)一次。

  3)對于上位機數(shù)據(jù)接收,除了以上最基本的接收功能外,還可以使用JDBC與mysql等數(shù)據(jù)進行存儲,并繪畫數(shù)據(jù)曲線實現(xiàn)特性分析。

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉